分段错误11并在c

时间:2016-02-09 14:12:09

标签: c arrays segmentation-fault

我正在开发一个项目,要求我保留用户最近输入的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

2 个答案:

答案 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)

两个主要问题:

  1. strcpy()指向未初始化的指针,它会调用未定义的行为。您需要使指针指向有效的内存。使用malloc() / free()或将数组设为二维。

  2. 您正在使用sizeof运算符通过指向数组的指针来确定数组的大小,这是错误的。当sizeof的操作数是指针时,如果指针的大小为sizeof(void *),则该结果不是数组的大小。您可以将大小传递给函数,或者可以在数组的末尾添加NULL指针并迭代直到找到它,就像中用于字符串的概念一样。