我正在开发一个项目,要求我保留用户最近输入的10个命令的数组,并创建一个小的测试程序,以确保我实际上可以创建一个包含10个字符串的数组并将其打印出来。下面复制的代码在运行时会生成“Segmentation fault:11”,即使它没有警告或错误也会编译。我是c的新手,我知道这个任务需要一些指向字符数组的指针组合,但我似乎无法让它工作。我需要做什么才能在'history'中的任何10个索引处覆盖字符串,并通过调用printFullHistory()来打印当前的历史数组?
void printFullHistory(char** history){
for(int i = 0; i < sizeof(history); i++){
for(int j = 0; j < sizeof(history)[i]; j++){
printf("%s", history[i][j]);
}
}
}//end printFullHistory
int main(){
char* history[10];
strcpy(history[0], "ls");
printFullHistory(history);
return 0;
}//end main
答案 0 :(得分:3)
sizeof
是您的问题之一,这也是错误的:
char* history[10];
strcpy(history[0], "ls");
history[0]
未初始化为指向有效内存,您无法写入。
此外:
printf("%s", history[i][j]);
history[i][j]
指的是第i个字符串的第j个字母,所以也许你想使用%c
。但是,您无法打印未初始化变量的值。如果这样做,这是未定义的行为。
答案 1 :(得分:1)
两个主要问题:
您strcpy()
指向未初始化的指针,它会调用未定义的行为。您需要使指针指向有效的内存。使用malloc()
/ free()
或将数组设为二维。
您正在使用sizeof
运算符通过指向数组的指针来确定数组的大小,这是错误的。当sizeof
的操作数是指针时,如果指针的大小为sizeof(void *)
,则该结果不是数组的大小。您可以将大小传递给函数,或者可以在数组的末尾添加NULL
指针并迭代直到找到它,就像c中用于字符串的概念一样。