C 数组复制循环使每个元素都相同

C 数组复制循环使每个元素都相同,c,arrays,file-io,C,Arrays,File Io,我正在制作一个C程序,它应该读取一个文件并对文件中包含的字符串进行排序。为此,我试图将文件中的每个字符串复制到char*数组中,但遇到了一个问题。下面的代码最后用文件中的最后一个字符串填充整个数组,我不知道发生了什么。我已经测试了循环,它确实完美地遍历了文件,并将每个字符串复制到数组中,但每次循环迭代都会使数组中的每个元素等于buff // find the size of the file fseek(fp, 0L, SEEK_END); long fileSize = ftell(fp);

我正在制作一个C程序,它应该读取一个文件并对文件中包含的字符串进行排序。为此,我试图将文件中的每个字符串复制到
char*
数组中,但遇到了一个问题。下面的代码最后用文件中的最后一个字符串填充整个数组,我不知道发生了什么。我已经测试了循环,它确实完美地遍历了文件,并将每个字符串复制到数组中,但每次循环迭代都会使数组中的每个元素等于
buff

// find the size of the file
fseek(fp, 0L, SEEK_END);
long fileSize = ftell(fp);
rewind(fp);

char* fileContents[fileSize]; // we're gonna copy the file into here
char buff[255];
long stringsInFile = 0L;
while( fgets(buff, 255, (FILE*) fp) ) {
    // copy the file into the array & get the number of strings
    fileContents[stringsInFile] = buff;
    stringsInFile++;
}
我确信这是我忽略的简单的事情;无法将字符串复制到数组中,我觉得很傻。
顺便说一句,这绝对是家庭作业

之所以发生这种情况,是因为您一直将相同的数组指针
buff
分配给指针数组
fileContents
的每个元素

除非您希望将
fileContents
中的所有字符串预分配到最大255,否则您需要在分配前复制
buf

while( fgets(buff, 255, (FILE*) fp) ) {
    // copy the file into the array & get the number of strings
    size_t len = strlen(buff);
    char *copy = malloc(len+1);
    strcpy(copy, buf);
    fileContents[stringsInFile] = copy;
    stringsInFile++;
}
由于此代码使用动态分配,因此在使用完分配的内存后,您需要释放该内存:

for (int i = 0 ; i != stringsInFile ; i++) {
    free(fileContents[i]);
}

最后,您将
fileContents
分配给文件中的字节数是非常保守的:您知道不会超过限制,但浪费量可能太大。

您不是在
buff
中复制数据,而是在
buff
中复制指向第一个字符的指针(这不会改变),一次又一次地切换到
fileContents
。好的,那么这个代码片段将把数组中的每个元素作为指向buff中最后一个元素的指针,改为使每个元素成为buff的当前内容?你能解释一下我如何通过fileContents分配来浪费空间吗?非常感谢你的帮助@vulcao假设该文件平均每行有20个字符。那么一个1000行的文件就有20000个字符长。分配一个20000个指针的数组,1000个就足够了。