129-Análisis de algunos problemas con punteros

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
Inserte la descripción de la imagen aquí
siguiente
Inserte la descripción de la imagen aquí

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
Inserte la descripción de la imagen aquí
. Cuando la
Inserte la descripción de la imagen aquí
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
Inserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí
Analice
Inserte la descripción de la imagen aquí
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;
}

Supongo que te gusta

Origin blog.csdn.net/LINZEYU666/article/details/112286038
Recomendado
Clasificación