我不明白为什么当“ i”正确递增时,数组的第一个值在内部while循环之外更改。我是否以某种混乱的方式分配内存?我该如何解决这个问题?
int main(void)
{
int sizeArray = 5, sizeString = 10;
FILE *fin = fopen("file.txt", "r");
char ** arr = (char **) malloc(sizeArray * sizeof(char *));
char line[1000];
char *word;
int i = 0;
while(fgets(line, 100, fin) != NULL)
{
word = strtok(line, " ");
while (i < 2)
{
arr[i] = (char *)malloc(sizeString * sizeof(char));
arr[i] = word;
printf("Inner print: %s\n\n",arr[0]);
word = strtok(NULL, " ");
i++;
}
}
printf("This is the final arr[0] (outer print): %s",arr[0]);
}
file.txt读为:
First second.
Third! Fourth
控制台上的打印内容如下:
Inner print: First
Inner print: First
The final arr[0] (outer print): Third!
当我希望外部打印为:首先
答案 0 :(得分:1)
您使用(require "utils.rkt")
分配了一些内存。然后,您立即用arr[i] = (char *)malloc(sizeString * sizeof(char));
覆盖该指针(释放内存),以便arr[i] = word
现在指向arr[i]
缓冲区中的某个位置。
您需要将line
指向的字符串复制到为word
分配的缓冲区中:
arr[i]
答案 1 :(得分:0)
您需要在外部while循环内移动int i = 0;
。或至少在内环完成后将其重置为零。
arr[i] = word
不是您在C语言中复制字符串的方式。请看一下strcpy
,甚至更好的strncpy
。
完成arr[i] = word
之后立即执行arr[i] = (char *)malloc
会使malloc
完全无用。完成此操作的唯一方法是分配空间,然后将指针扔掉,从而导致内存泄漏。