Acerca de los punteros de estructura

He encontrado varios problemas con la asignación y transmisión de punteros de estructura en el proyecto. Hoy he vuelto para resumirlo. Parece que algunos puntos de conocimiento no se han aprendido.
Vea el ejemplo a continuación.

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 typedef struct data
  5 {
  6     int a;
  7     int value;
  8     char type;
  9     int width;
 10     int height;
 11 }DATA,*PDATA;
 12 
 13 
 14 void structprintf(struct data *pData)
 15 {
 16     printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pData->a,pData->value
 17         ,pData->type,pData->width,pData->height);
 18 }
 19 
 20 int main(void)
 21 {
 22     PDATA pDa ;
 23     
 24     printf("%d\n",sizeof(pDa));
 25 
 26     pDa = (PDATA)malloc(sizeof(struct data));
 27 
 28     printf("%d\n",sizeof(pDa));
 29 
 30     pDa->a = 2;
 31     pDa->value = 3;
 32     pDa->type = 'a';
 33     pDa->width = 1230;
 34     pDa->height = 2340;
 35     
 36     structprintf(pDa);
 37 
 38     printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pDa->a,pDa->value
 39                 ,pDa->type,pDa->width,pDa->height);
 40                 
 41     free(pDa);
 42     
 43 //  printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pDa->a,pDa->value
 44 //                 ,pDa->type,pDa->width,pDa->height);
 45                    
 46     pDa = NULL;    
 47     
 48     return 0;
 49 } 

En el ejemplo anterior, si define directamente un puntero de estructura:

 PDATA pDa ;

Luego use la función malloc para abrir espacio y realizar la siguiente operación de asignación

 30     pDa->a = 2;
 31     pDa->value = 3;
 32     pDa->type = 'a';
 33     pDa->width = 1230;
 34     pDa->height = 2340;

Luego imprima directamente los resultados de los miembros anteriores a través de printf

 38     printf("a:%d,value:%d,type:%c,width:%d,height:%d\n",pDa->a,pDa->value
 39                 ,pDa->type,pDa->width,pDa->height);

Como resultado, habrá una falla predeterminada, pero cuando me encontré con esto, no entendí por qué (sonrisa irónica, realmente estúpida, parece que la base no es sólida), porque el puntero de estructura es solo un puntero, una variable de cuatro bytes, porque no hay estructura Espacio de memoria, si lo asigna directamente, se producirá una falla predeterminada

28		printf("%d\n",sizeof(pDa));
(gdb) n
4
30		pDa->a = 2;
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x080484b8 in main () at struct.c:30
30		pDa->a = 2;

En ese momento en el desarrollo del proyecto, encontré una variable de puntero de estructura definida y luego la pasé a otra función, y luego en la función que usa el puntero de estructura para pasar el resultado, imprimí el valor del miembro de estructura y descubrí que el valor impreso es 0 En ese momento, me preguntaba por qué no había ningún valor. Revisé nuevamente a la izquierda y no hubo ningún error, pero simplemente no pude lograr el resultado esperado. Más tarde, cambié la variable del puntero de estructura a una variable de estructura y luego la pasé por dirección. Se acaba de registrar este problema, pero cuando quiero reproducir e investigar aquí, no puedo recordar cómo operarlo. Ahora lo he encontrado de nuevo. Finalmente lo descubrí. Esta vez también lo pensé en la estructura de datos. Al agregar un nuevo nodo a la lista vinculada, defina un puntero de estructura, y luego necesita abrir un espacio a través de la función malloc, y luego señalar este espacio de memoria a través del puntero de estructura, es suficiente, esta vez finalmente lo entiendo, pero también una conciencia profunda Para cuando debería estudiar de nuevo.
También entiendo las variables de estructura y las variables de puntero.
Piénselo cuando acaba de ingresar al trabajo. Debido a que no tiene suficiente experiencia, aunque haya estudiado, todo el sistema de conocimiento está flotando en la nube, y la mentalidad y el estado de la persona en su conjunto son impetuosos y El estado de flotación, por lo que mirar el código es solo mirar las flores, y no siente nada, por lo que hay muchos puntos de conocimiento que han salido mal, lo que hace que mi lógica de código simple sea incomprensible. El resultado del nerviosismo y la impaciencia es que la eficiencia es muy pobre, así que he estado reflexionando y revisando mis pensamientos y acciones recientemente. Realmente debería calmarme y no ser afectado por otros.
Lo siguiente es sobre la estructura y el puntero de estructura definidos en el proyecto. En ese momento, había dudas sobre por qué el puntero de estructura del proyecto se podía asignar directamente. Más tarde, después de lo anterior, después de revisar el código nuevamente, se descubrió que el prototipo es una variable de estructura. En el momento de la definición, le ha abierto espacio, por lo que es suficiente señalar directamente el puntero de la estructura a la dirección. En ese momento, también debe comprender para qué sirve, pero no consideró estos problemas y puntos de conocimiento en profundidad.

typedef struct _s_copy_service
{
	S_CPYJOB_INFO   stCopyJobInfo;  //this info shared with printing
	S_CPYSCAN_INFO  stScanInfo;
} S_COPY_SERVICE, *PS_COPY_SERVICE;

const PS_CPYJOB_INFO    pCpyInfo      = &(pSrv->stCopyJobInfo);
const PS_CPYSCAN_INFO   pScanInfo     = &(pSrv->stScanInfo);
Publicado 53 artículos originales · elogiado 16 · visitas 2213

Supongo que te gusta

Origin blog.csdn.net/m0_37757533/article/details/100516940
Recomendado
Clasificación