重新分配指针数组
realloc array of pointers
这是我计划的一部分。 parameters.path
是一个字符串,其中包含我将要使用的文件的路径,但此代码中没有。
typedef struct directory {
char *name;
char *path;
} directory;
void insertDir(directory*** array , char * path, char* name, int* length) {
directory *p = malloc(sizeof(directory));
p->path = malloc(strlen(path)+ 1);
strcpy(p->path, path);
p->name = malloc(strlen(name)+ 1);
strcpy(p->name, name);
*array = (directory**) realloc( *array , (*length) * (sizeof(directory*)));
*array[(*length)] = p;
(*length)++;
}
int main(int argc , char** argv) {
directory** array = NULL;
int lenght = 0;
while(true) {
insertDir(&array, parameters.path, name , &lenght);
}
return 0;
}
它在第三次 realloc
上因分段错误而失败。你能帮帮我吗?
在执行realloc()
时,您需要将长度加1,因为您还没有递增它。
*array = realloc( *array , (*length + 1) * (sizeof(directory*)));
您还需要更改:
*array[(*length)] = p;
至:
(*array)[*length] = p;
因为下标运算符的优先级高于解引用运算符。请参阅 C 运算符优先级 table here。 []
.
内也不需要括号
除了 (*array)[*length]
索引问题之外,您还为 malloc
和 realloc
的几次分配失败敞开了大门。首先,一般来说,始终验证 您的分配是否成功。说够了。
接下来,对于 realloc
,最好使用 temporary
变量而不是数组重新分配。如果重新分配失败,realloc
returns NULL
会导致您完全失去 array
的地址。这将导致所有现有数据丢失。相反,如果您使用 tmp
指针进行重新分配,您将能够以优雅的方式处理故障,并且能够 free
最初分配给 array
的内存块。
这是处理 allocations/reallocations 的更可靠的方法。 注意:您需要对重新分配失败的响应进行编码:
void insertDir (directory*** array, char *path, char *name, int *length)
{
directory *p = malloc (sizeof *p);
if (!p) {
fprintf (stderr, "error: virtual memory exhausted.\n");
exit (EXIT_FAILURE);
}
p->path = malloc (strlen (path) + 1);
strcpy (p->path, path);
p->name = malloc (strlen (name) + 1);
strcpy(p->name, name);
directory **tmp = realloc (*array, (*length + 1) * sizeof *tmp);
if (!tmp) {
fprintf (stderr, "error: struct reallocation failure.\n");
exit (EXIT_FAILURE);
}
*array = tmp;
(*array)[*length] = p;
(*length)++;
}
这是我计划的一部分。 parameters.path
是一个字符串,其中包含我将要使用的文件的路径,但此代码中没有。
typedef struct directory {
char *name;
char *path;
} directory;
void insertDir(directory*** array , char * path, char* name, int* length) {
directory *p = malloc(sizeof(directory));
p->path = malloc(strlen(path)+ 1);
strcpy(p->path, path);
p->name = malloc(strlen(name)+ 1);
strcpy(p->name, name);
*array = (directory**) realloc( *array , (*length) * (sizeof(directory*)));
*array[(*length)] = p;
(*length)++;
}
int main(int argc , char** argv) {
directory** array = NULL;
int lenght = 0;
while(true) {
insertDir(&array, parameters.path, name , &lenght);
}
return 0;
}
它在第三次 realloc
上因分段错误而失败。你能帮帮我吗?
在执行realloc()
时,您需要将长度加1,因为您还没有递增它。
*array = realloc( *array , (*length + 1) * (sizeof(directory*)));
您还需要更改:
*array[(*length)] = p;
至:
(*array)[*length] = p;
因为下标运算符的优先级高于解引用运算符。请参阅 C 运算符优先级 table here。 []
.
除了 (*array)[*length]
索引问题之外,您还为 malloc
和 realloc
的几次分配失败敞开了大门。首先,一般来说,始终验证 您的分配是否成功。说够了。
接下来,对于 realloc
,最好使用 temporary
变量而不是数组重新分配。如果重新分配失败,realloc
returns NULL
会导致您完全失去 array
的地址。这将导致所有现有数据丢失。相反,如果您使用 tmp
指针进行重新分配,您将能够以优雅的方式处理故障,并且能够 free
最初分配给 array
的内存块。
这是处理 allocations/reallocations 的更可靠的方法。 注意:您需要对重新分配失败的响应进行编码:
void insertDir (directory*** array, char *path, char *name, int *length)
{
directory *p = malloc (sizeof *p);
if (!p) {
fprintf (stderr, "error: virtual memory exhausted.\n");
exit (EXIT_FAILURE);
}
p->path = malloc (strlen (path) + 1);
strcpy (p->path, path);
p->name = malloc (strlen (name) + 1);
strcpy(p->name, name);
directory **tmp = realloc (*array, (*length + 1) * sizeof *tmp);
if (!tmp) {
fprintf (stderr, "error: struct reallocation failure.\n");
exit (EXIT_FAILURE);
}
*array = tmp;
(*array)[*length] = p;
(*length)++;
}