这是一个非常简单的程序,我在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;
}
如果有人可以提供帮助,那就太棒了。
答案 0 :(得分:2)
char *list[MAX_LIST_SIZE];
这里,list
的元素未初始化,它们不指向有效的内存,因此您的程序会调用未定义的行为。 strcpy()
返回指针NULL
或指向某个malloc()
内存的指针,因此有效。
答案 1 :(得分:2)
非标准strdup函数做两件事:它分配动态内存并复制字符串。这与调用malloc然后调用strcpy是完全相同的(这就是为什么strdup是一个100%多余的函数)。
执行strcpy(list[list_size],test)
时,list不指向任何已分配的内存 - 它指向内存中任意位置的随机内存位置。您尝试将数据复制到此随机位置并发生崩溃。
您使用test
分配内存并指向它。当你让test
指向file
时,你忘记了所有关于那个记忆的内容,你创造了一个内存泄漏。一旦你完成了这个,就会出现与1中相同的错误,因为变量test
和file
与list
无关。
与1和2中的错误相同。
在深入研究动态内存分配和字符串处理之前,我建议稍微研究一下指针和数组。