在二维字符串动态数组上出现段错误

时间:2020-03-01 02:30:23

标签: multidimensional-array dynamic segmentation-fault c-strings strlen

当我尝试打印字符串的strlen(字符串数组的一部分)时,为什么会出现段错误?我可以打印每个字符串-printf可以完美地工作。但是为什么strlen会导致段错误?

下面的程序首先接受输入n,这是我要动态分配的字符串数。然后我为每个字符串分配32个字节的空间

int main() {
    int i;
    int n;
    char **nums;
    scanf("%d", &n);
    printf("n = %d\n", n);
    nums = malloc(sizeof(char *) * n);
    printf("allocated nums\n");
    for(i=0; i<n; i++) {
        nums[i] = malloc(sizeof(char) * 32);
        memset(nums[i], '\0', sizeof(char) * 32);
    }
    for(i=0; i < n; i++) {
        scanf("%s", &nums[i]);
    }

    for(i=0; i<n; i++) {
        // THIS PRINTS FINE
        printf("string = %s\n", &nums[i]);
        // SEGFAULT HERE IMMEDIATELY
        printf("length = %d\n", strlen(nums[i]));
    }

这是控制台输出。作为测试,我输入n = 3,然后输入数字45、46和47:

3
n = 3
allocated nums
45
46
47
string = 45
Segmentation fault (core dumped)

此外,当我尝试访问每个字符串中的单个字符时,我也会遇到段错误。同样,外部for循环中的第一个printf打印字符串,然后我得到一个访问nums [i] [k]的段错误:

    int i, k=0;
    for(i=0; i<n; i++) {
        printf("Printiiing: %s\n", &nums[i]);
        // WHY DOES THIS SEGFAULT???
        //printf("first char = %c\n", nums[i][0]);
        while(k<32 && nums[i][k] != '\0') {
            // THIS CAUSES A SEG FAULT
            printf("char = %c", (nums[i])[k]);
            k++;
        }
    }

2 个答案:

答案 0 :(得分:0)

这很好:

    for(i=0; i<n; i++) {
        nums[i] = malloc(sizeof(char) * 32);
        memset(nums[i], '\0', sizeof(char) * 32);
    }

此循环之后,每个nums[i]都是一个指向32字节缓冲区的指针。

但这会破坏(覆盖)所有指针,而不是将字符串读入分配的缓冲区中:

    for(i=0; i < n; i++) {
        scanf("%s", &nums[i]);
    }

要修复该错误,请使用:scanf("%s", nums[i]);

答案 1 :(得分:0)

&nums[i]nums[i]地址之间有一个差异指针。您可以使用strlen((const char*)(&nums[i]))检查长度。
@Employee of Russia的解释完全是出于原因。