Acceso a la memoria dinámica en un puntero de estructura -- ampo con arrays campo con dynamic campo con struct campo con malloc camp Relacionados El problema

Accessing dynamic memory in a struct pointer


1
vote

problema

Español

Estoy escribiendo algún código para interactuar con la memoria dinámica que estoy creando y quiero saber por qué no funciona.

  struct order{     char *bookTitle;     double price;     char *category;     double remain;     int custID;     char processed; }; typedef struct order order;  struct orderNode{     order *order;     struct orderNode *next; }; typedef struct orderNode orderNode;   

Aquí está el código creatinng una matriz o orden de orden y intenta acceder a ellos. La declaración de impresión me está dando una falla de segmentación. No estoy seguro de por qué.

  orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;     //sort the orders into their respective categories     //sortOrders(processQueue, unSortedQueue, numcats);     processQueue[1]->order->category = "herro" ;     puts("string set.  ");     printf("%s ",processQueue[1]->order->category);     /*      gdb backtrace output.     #0  strlen () at ../sysdeps/x86_64/strlen.S:106     #1  0x00007ffff786794c in _IO_puts (str=0x1000000000a2074 <error: Cannot access memory at address 0x1000000000a2074>)     at ioputs.c:36     #2  0x000000000040192f in main (argc=4, argv=0x7fffffffdbd8) at main.c:444     */   

¡Gracias de antemano!

Original en ingles

I'm writing some code to interact with dynamic memory that i' creating and i want to know why it's not working.

struct order{     char *bookTitle;     double price;     char *category;     double remain;     int custID;     char processed; }; typedef struct order order;  struct orderNode{     order *order;     struct orderNode *next; }; typedef struct orderNode orderNode; 

Here is the code creatinng an array or orderNodes and trying to access them. The print statement is giving me a segmentation fault. Not sure why.

orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;     //sort the orders into their respective categories     //sortOrders(processQueue, unSortedQueue, numcats);     processQueue[1]->order->category = "herro" ;     puts("string set. \n");     printf("%s\n",processQueue[1]->order->category);     /*      gdb backtrace output.     #0  strlen () at ../sysdeps/x86_64/strlen.S:106     #1  0x00007ffff786794c in _IO_puts (str=0x1000000000a2074 <error: Cannot access memory at address 0x1000000000a2074>)     at ioputs.c:36     #2  0x000000000040192f in main (argc=4, argv=0x7fffffffdbd8) at main.c:444     */ 

Thanks in advance!

              
 
 

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

creo que en lugar de

  orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ;   

te refieres

  orderNode *processQueue = malloc(sizeof(orderNode)*numcats) ;   

También tenga en cuenta que para cada nombre de pedido en la matriz, debe asignar el miembro de datos order antes de intentar acceder a sus propios miembros de datos.

e índices en C comienzan de cero. Parece que en esta declaración

  processQueue[1]->order->category = "herro" ;   

Usted desea acceder a const UNLEN = 256; // Maximum user name length function GetWindowsUsername: string; var UserName : string; UserNameLen : Dword; begin UserNameLen := UNLEN; SetLength(UserName, UserNameLen) ; if GetUserName(PChar(UserName), UserNameLen) then Result := Copy(UserName, 1, UserNameLen - 1) else Result := ''; end; 0 en lugar de const UNLEN = 256; // Maximum user name length function GetWindowsUsername: string; var UserName : string; UserNameLen : Dword; begin UserNameLen := UNLEN; SetLength(UserName, UserNameLen) ; if GetUserName(PChar(UserName), UserNameLen) then Result := Copy(UserName, 1, UserNameLen - 1) else Result := ''; end; 1111

El código podría parecer

  const   UNLEN = 256; // Maximum user name length  function GetWindowsUsername: string; var   UserName : string;   UserNameLen : Dword; begin   UserNameLen := UNLEN;   SetLength(UserName, UserNameLen) ;   if GetUserName(PChar(UserName), UserNameLen)   then Result := Copy(UserName, 1, UserNameLen - 1)   else Result := ''; end; 2  
 

I think that instead of

orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ; 

you mean

orderNode *processQueue = malloc(sizeof(orderNode)*numcats) ; 

Also take into account that for each orderNode in the array you have to allocate data member order before trying to access its own data members.

And indices in C start from zero. It seems that in this statement

processQueue[1]->order->category = "herro" ; 

you want to access processQueue[0] instead of processQueue[1]

The code could look like

orderNode *processQueue = malloc( sizeof( orderNode ) * numcats );  processQueue[0].order = malloc( sizeof( order ) ); processQueue[0].order->category = "herro";  puts( "string set." ); puts( processQueue[0].order->category ); 
 
 
2
 
vote

Nunca asignó ninguno de su const UNLEN = 256; // Maximum user name length function GetWindowsUsername: string; var UserName : string; UserNameLen : Dword; begin UserNameLen := UNLEN; SetLength(UserName, UserNameLen) ; if GetUserName(PChar(UserName), UserNameLen) then Result := Copy(UserName, 1, UserNameLen - 1) else Result := ''; end; 3 :

  const   UNLEN = 256; // Maximum user name length  function GetWindowsUsername: string; var   UserName : string;   UserNameLen : Dword; begin   UserNameLen := UNLEN;   SetLength(UserName, UserNameLen) ;   if GetUserName(PChar(UserName), UserNameLen)   then Result := Copy(UserName, 1, UserNameLen - 1)   else Result := ''; end; 4  

Además, usé CALLOC para la primera asignación para asegurarse de que todos sus punteros son nulos. Sin embargo, no estoy seguro de lo que planea hacer con esos orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ; 16 los punteros.

Editar: También, como se señaló Vlad de Moscú, ProcessQueue fue del tipo incorrecto (fijé el tipo arriba).

 

You never allocated any of your order:

orderNode *processQueue = calloc(numcats, sizeof(orderNode)) ;  for (i=0;i<numcats;i++)     processQueue[i].order = calloc(1, sizeof(order)); 

Also, I used calloc for the first allocation to make sure all of your next pointers are NULL. I'm not sure what you plan on doing with those next pointers, though.

EDIT: also, as Vlad from Moscow pointed out, processQueue was of the wrong type (I fixed the type above).

 
 

Relacionados problema

0  Función libre () no desatifique la memoria de un vector [duplicado]  ( Function free doesnt de allocate memory from a vector ) 
Esta pregunta ya tiene respuestas aquí : usando puntero después de libre () ...

16  Compruebe si un puntero apunta a la memoria asignada en el montón  ( Check if a pointer points to allocated memory on the heap ) 
Quiero saber si un puntero apunta a una pieza de memoria asignada con malloc / nuevo. Me doy cuenta de que la respuesta para una dirección arbitraria es "No, ...

1  ¿Mal puntero al usar malloc?  ( Bad pointer when using malloc ) 
Estoy intentando lo siguiente: Niki::class0 donde la entrada es una cadena. ¿Qué es extraño es que a veces esto funciona, y a veces tocrypt le da un pun...

0  ¿Cómo liberé mallocs anidados de una biblioteca C compartida en Python (CTYPES)?  ( How do i free nested mallocs from a c shared library in python ctypes ) 
Tengo este código C: test.c #define max_size 9 #define max_value 11 char ** my_function(char my_string[]){ char **my_array = malloc(sizeof(char *)...

6  Liberando recursivamente las estructuras C  ( Recursively freeing c structs ) 
Tengo una estructura que solo contiene punteros a la memoria que he asignado. ¿Hay alguna manera de liberar recursivamente cada elemento que es un puntero en ...

2  Copiando las matrices en C  ( Copying matrixes in c ) 
Así que tengo esto: CHAR TABLE1 [10 ^ Duración] [Longitud]; CHAR TABLE2 [LONGITUD DE 10 ^] [LONGITUD]; y el compilador no me dejan saltar esto: TABLA1 = TAB...

1  ¿Por qué el comando Libre de Linux no está mostrando una memoria menos gratuita cuando ejecuto un proceso que sigue al asignar la memoria?  ( Why linux free command is not showing less free memory when i run a process whic ) 
He escrito un programa C, en el que asigna continuamente la memoria (de 1 MB de tamaño) utilizando malloc. No libero esta memoria. Si bien este programa se es...

35  Asignadores de memoria multithreaded para C / C ++  ( Multithreaded memory allocators for c c ) 
Actualmente tengo una aplicación de servidor en gran medida en roscada, y estoy compras para un buen asignador de memoria multi-roscado. Hasta ahora estoy d...

17  ¿Por qué estoy obteniendo un error de doble libre o corrupción con RealLOC ()?  ( Why am i getting a double free or corruption error with realloc ) 
He intentado escribir una función de reemplazo de cadena en C, que funciona en un char * , que se ha asignado utilizando malloc() . Es un poco diferente, ya...

14  ¿Cuáles son algunos ejemplos útiles de malloc () en c?  ( What are some useful examples of malloc in c ) 
Solo estoy leyendo sobre malloc() en c. The Artículo de Wikipedia proporciona una Ejemplo , sin embargo, solo asignan la memoria suficiente para una ma...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos