我在内存分配/释放方面有一些问题。
在一台“64位机器”上,我运行了一些没有错误的c代码。
如果我在32位机器上运行相同的代码(在重新编译之后,obv),我会遇到一些分段错误。
这是我的glib-c版本:
包装:libc6
新的:是的
状态:已安装
自动安装:否
版本:2.13-20ubuntu5
优先级:必需
章节:libs
维护者:Ubuntu开发者
未压缩尺寸:10,7 M
取决于:libc bin(=2.13-20ubuntu5)、libgcc1、tzdata
建议:glibc doc,debconf | debconf-2.0,locales
冲突:beloces bin,belocs locales bin,libc6-amd64,libc6-amd64,
预墨(2007k-1),tzdata(中断:nscd(替换:belocs locales bin,belocs locales bin,libc6-amd64,libc6-amd64,
libc6(提供:glibc-2.13-1
Description:libreria C GNU嵌入:librerie condivise
在32位计算机上,版本为:
2.06-01年
更重要的是,下面是让我抓狂的代码片段:

void estrai_libro (FILE* fileDescriptor, Libro* libroLetto) {

char* ptr_buf;
size_t n;
size_t lung;
ssize_t nread;

/* ---- questo blocco di istruzioni verrà utilizzato per tutti
    i campi della struttura Libro passata in input */
/* inizializzo ptr_buf e n rispettivamente a NULL e a 0 in moda da
   da sfruttare al meglio la getline(...)*/
ptr_buf = NULL;
n = 0;
/* copio all'interno del buffer ptr_buf il contenuto di una riga
       del file; la funzione getline legge dal file fino a quando non
   incontra uno \n (ecco perchè io formatto gli input) */
nread = getline (&ptr_buf, &n, fileDescriptor);
/* calcolo la lunghezza della stringa letta */
lung = strlen (ptr_buf);
/* istanzio una zona di memoria della stessa dimensione della stringa
   letta e fatta puntare dal campo titolo della struttura Libro */
libroLetto->titolo = (char*) malloc (lung*sizeof(char));
/* inizializzo la zona di memoria istanziata con degli 0 */
memset (libroLetto->titolo, 0, sizeof(libroLetto->titolo));
/* copio la stringa letta e contenuta in ptr_buf nel campo titolo
   della struttura Libro passata in input (libroLetto). */
strcpy (libroLetto->titolo,ptr_buf);
free (ptr_buf);
/* ---- fine blocco*/
ptr_buf = NULL;
n = 0;
nread = getline (&ptr_buf, &n, fileDescriptor);
lung = strlen (ptr_buf);
libroLetto->autore = (char*) malloc (lung*sizeof(char));
memset (libroLetto->autore, 0, sizeof(libroLetto->autore));
strcpy (libroLetto->autore,ptr_buf);
free (ptr_buf);
ptr_buf = NULL;
n = 0;
nread = getline (&ptr_buf, &n, fileDescriptor);
lung = strlen (ptr_buf);
libroLetto->editore = (char*) malloc (lung*sizeof(char));
memset (libroLetto->editore, 0, sizeof(libroLetto->editore));
strcpy (libroLetto->editore,ptr_buf);
free (ptr_buf);
ptr_buf = NULL;
n = 0;
nread = getline (&ptr_buf, &n, fileDescriptor);
lung = strlen (ptr_buf);
libroLetto->data_pubblicazione = (char*) malloc (lung*sizeof(char));
memset (libroLetto->data_pubblicazione, 0, sizeof(libroLetto->data_pubblicazione));
strcpy (libroLetto->data_pubblicazione,ptr_buf);
free (ptr_buf);
ptr_buf = NULL;
n = 0;
nread = getline (&ptr_buf, &n, fileDescriptor);
lung = strlen (ptr_buf);
libroLetto->num_pagine = (char*) malloc (lung*sizeof(char));
memset (libroLetto->num_pagine, 0, sizeof(libroLetto->num_pagine));
strcpy (libroLetto->num_pagine,ptr_buf);
free (ptr_buf);
ptr_buf = NULL;
n = 0;
nread = getline (&ptr_buf, &n, fileDescriptor);
lung = strlen (ptr_buf);
libroLetto->num_copie = (char*) malloc (lung*sizeof(char));
memset (libroLetto->num_copie, 0, sizeof(libroLetto->num_copie));
strcpy (libroLetto->num_copie,ptr_buf);
free (ptr_buf);
ptr_buf = NULL;
n = 0;
nread = getline (&ptr_buf, &n, fileDescriptor);
free (ptr_buf);
}

有人有主意吗?
我的第一个版本是glib-c,但现在我可以了
到达32位机器并“更新”那个库。所以,有人可以称呼我吗?
编辑:为了清楚起见,分段错误在释放之前出现(ptr_buf)

最佳答案

 libroLetto->titolo = (char*) malloc (lung*sizeof(char));
 memset (libroLetto->titolo, 0, sizeof(libroLetto->titolo));

sizeof(libroLetto->titolo)是指针成员的大小,而不是分配的对象。
你想要的是:memset(libroLetto->titolo, 0, lung)
您可能还想在每次调用getline函数时检查它的返回值,否则strlen可能会得到意外的结果。
最后但并非最不重要:
lung = strlen (ptr_buf);
libroLetto->autore = (char*) malloc (lung*sizeof(char));

您没有为后面的空字符分配空间,您需要的是malloc(lung + 1)

10-04 14:39