这是一个非常简单的程序,我用C语言编写,运行良好,但我不懂一些术语:
而不是list[list_size] = strdup(file)
我会:char*test=file
和strcpy(list[list_size],test)
。我明白了
分割错误。char*test=malloc(sizeof(char)*MAX_FILENAME_LEN+1)
和test=file
以及strcpy(list[list_size],test)
。我有分割错误。
甚至strcpy(list[list_size],file)
。我有分割错误。
# include < stdio.h >
# include < string.h >
# define MAX_LIST_SIZE 1000
# define MAX_FILENAME_LEN 128
int main() {
FILE * infile;
char * list[MAX_LIST_SIZE],
file[MAX_FILENAME_LEN + 1];
size_t list_size = 0;
infile = popen("ls", "r");
if (infile != NULL) {
while ((list_size < MAX_LIST_SIZE) &&(fscanf(infile, "%s", file) == 1)) {
list[list_size] = strdup(file);
list_size++;
puts(file);
}
}
pclose(infile);
return 0;
}
如果有人能帮忙,那就太好了。
最佳答案
非标准strdup函数做两件事:分配动态内存和复制字符串。这与调用malloc然后调用strcpy是完全相同的(这就是为什么strdup是一个100%多余的函数)。
当您执行strcpy(list[list_size],test)
时,list并不指向任何已分配的内存-它指向内存中任意位置的随机内存。您尝试将数据复制到这个随机位置,然后发生崩溃。
分配内存并用test
指向它。当你让test
指向file
时,你就会忘记所有的记忆,相反,你已经造成了一个内存泄漏。一旦你这样做了,你就做了和1中一样的错误,因为变量test
和file
与list
无关。
与1和2中的错误相同。
我建议在深入研究动态内存分配和字符串处理之前,多研究一下指针和数组。