我有一个文本文件,可从中读取单词。在那之后,我必须在每个单词中写一个二进制文件,并在它附近显示行和列。在_strdup(p),我的程序崩溃了。有人知道为什么吗?多谢您的协助。这是代码:
void create(const char *filename, const char ****matrix) {
FILE *u, *f;
u = fopen(filename, "wb");
assert(u != NULL);
f = fopen("in.txt", "r");
assert(f != NULL);
(*matrix) = (char ***)malloc(sizeof(char **) * 1);
int i = 0;
int j=0; char buff[1024];
while (fgets(buff, 1024, f)!=NULL) {
(*matrix) = realloc((*matrix), (i + 1) * sizeof(char **));
char *p = strtok(buff, " ().,");
(*matrix)[i] = (char **)malloc(sizeof(char *));
while (p) {
(*matrix)[i] = (char **)realloc((*matrix)[i], sizeof(char *)*(j + 1));
strcpy((*matrix)[i], buff);
(*matrix)[i][j] = _strdup(p);
fwrite((*matrix)[i][j], sizeof(char *), 1, u);
fwrite(&i, sizeof(int), 1, u);
fwrite(&i, sizeof(int), 1, u);
j++;
(*matrix)[i][j] = NULL;
p = strtok(NULL, " ().,");
}
(*matrix)[i] = NULL;
i++;
printf("\n");
}
fclose(u);
fclose(f);
}
答案 0 :(得分:0)
由于未正确分配_strdup
的内存,因此对(*matrix)[i][j]
的调用可能会失败。
不必使用尽可能多的指针来读取文件中的单词,但是鉴于您正在使用它们,因此需要以正确的顺序为每个指针创建内存。
>那是
matrix = malloc(sizeof(char *));
是创建任何其他位置之前所需的第一个位置
例如,为 4维数组创建正确分配的指针集合的方法可能如下所示:
char **** Create4D(int hR, int p, int c, int r)
{
char ****arr;
int w,x,y;
arr = calloc(hR, sizeof(char *));
for(w=0;w<hR;w++)
{
arr[w] = calloc(p, sizeof(char *));
for(x=0;x<p;x++)
{
arr[w][x] = calloc(c, sizeof(char *));
for(y=0;y<c;y++)
{
arr[w][x][y] = calloc(r, 1);
// ^ sizeof(char) == 1
}
}
}
return arr;
}
请注意,斜体是提醒您这实际上不是在创建矩阵,而只是创建一个内存地址集合,其中一些内存用于指针,另一些空间用于字符串char
调用此函数:
char ****matrix = Create4D(2, 4, 6, 8);
if(matrix)//always test for success. If failed, matrix is set to NULL.
{
//use matrix
//With these arguments, 48 (2*4*6) pointers are created,
//each with space allocated to contain strings of 8 char each
....
还要注意,在所有这些调用中,此处不使用强制转换[m] [c] alloc的返回值 because it is not recommended in C 。另外,如果您计划创建所有这些内存,则必须为每次对free()
的调用而对calloc()
进行相应的调用。
在我的系统上调用上述方法产生的内存如下所示: