Pregunta 1
#include<stdio.h>
void fun(int*p)
{
int a=200;
*p=100;
p=&a;
}
int main()
{
int x=0;
int*ip=&x;
fun(ip);
printf("%d %d\n",x,*ip);
return 0;
}
El resultado de la impresión es el
siguiente
Pregunta 2
#include<stdio.h>
#include<stdlib.h>
int main()
{
int*p=(int *)malloc(sizeof(int));
*p=100;
printf("%d \n",*p);//100
free(p);
printf("%d \n",*p);//ddddd
*p=200;
printf("%d \n",*p);//200
return 0;
}
El resultado de la impresión es el siguiente
. Cuando la
función principal se está ejecutando, el sistema abre un marco de pila para la función principal, define un puntero p, p apunta al espacio abierto en el área del montón, * p = 100, elimina la referencia puntero y asigna un valor de 100, cuando está libre§, El espacio de pila se libera, el espacio es llenado por el sistema ddddd, el puntero p todavía apunta a esta dirección de espacio, imprime ddddd, y luego ejecuta * p = 200; el El puntero aún puede reasignar este espacio e imprimir 200. Este puntero se llama Es un puntero inválido, pero este enfoque es muy inseguro y otros programas seguirán accediendo a este espacio cuando continúen.
Pregunta 3
#include<iostream>
using namespace std;
class Object
{
private:
int value;
public:
Object(int x=0):value(x){
}
~Object(){
}
static void Show(){
cout<<"Object::Show"<<endl;}
void Print(){
cout<<"Object::Print"<<endl;}
void PrintValue(){
cout<<value<<endl;}
};
int main()
{
Object *op=NULL;
op->Show();
op->Print();
op->PrintValue();
return 0;
}
La palabra clave estática en la clase es equivalente a reemplazar el puntero this.
Los resultados de la impresión son los siguientes: La
tercera pantalla se bloquea.
Op apunta a un objeto vacío y no hay inicialización de valor. Llamar a la función PrintValue provoca un bloqueo.
Pregunta 4
#include<iostream>
using namespace std;
class Object
{
private:
int value;
public:
Object(int x=0):value(x){
}
~Object(){
}
static void Show(){
cout<<"Object::Show"<<endl;}
void Print(){
cout<<"Object::Print"<<endl;}
void PrintValue(){
cout<<value<<endl;}
};
int main()
{
Object *op=(Object*)malloc(sizeof(Object));
op->Show();
op->Print();
op->PrintValue();
return 0;
}
El resultado de la impresión es el siguiente:
Analice
el espacio de pila al que apunta op como se muestra en la figura siguiente , cree el espacio sin crear un objeto, y el sistema llenará cdcdcd, llamará a la función PrintValue y confunde cdcdcd como valor de valor, y imprime cdcdcd
Pregunta 5
Los objetos solo pueden asignar valores a objetos, no espacios
int main()
{
Object *op=(Object*)malloc(sizeof(Object));
Object obj(10);
*op=obj;//写法错误!对象不能给空间赋值
op->Show();
op->Print();
op->PrintValue();
return 0;
}