二维动态字符串数组上的分段错误

问题描述 投票:0回答:2

为什么当我尝试打印字符串的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++;
        }
    }
multidimensional-array dynamic segmentation-fault c-strings strlen
2个回答
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]);


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.