双指针捕获字符串导致段错误

时间:2016-04-14 18:42:59

标签: c pointers char

我想输入字符串,但它会一直返回段错误

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char **arr;
    arr= (char** ) malloc (5);

    for(int i =0 ; i<5 ; i++)
    {
        arr[i]=(char *)malloc(10);
    }

    for(int i=0 ; i<5 ;i++)
    {
        char ch[10];
        printf("%d",i);
        scanf("%s",ch);
        strcpy(arr[i],ch);
    }


    for(int i=0 ; i<5 ;i++)
    {
        printf("%s  ",arr[i]);
    }

    for(int i=0;i<5;i++)
        free (arr[i]);
    free (arr);
}

并且代码块也不会出错并且完全运行它可以告诉我为什么?

2 个答案:

答案 0 :(得分:0)

替换这段代码:

char **arr;
arr= (char** ) malloc (5);

for(int i =0 ; i<5 ; i++)
{
    arr[i]=(char *)malloc(10);
}

this:

char **arr;
arr = malloc (5*sizeof(char*));

for(int i = 0 ; i < 5 ; i++)
{
    arr[i] = malloc(10);
}

你的代码出了什么问题就是声明

arr= (char** ) malloc (5);

相当于

arr= (char** ) malloc (5 * sizeof(char));

表示为5个字符分配大小。 您需要做的是为arr为5 指向char 的指针分配空间,这就是您应该使用sizeof(char*)的原因。

您还可以查看this link,以便更好地了解分配双指针时内存中发生的情况。

答案 1 :(得分:0)

关于以下几行:

for(int i=0 ; i<5 ;i++)
{
    char ch[10];
    printf("%d",i);
    scanf("%s",ch);
    strcpy(arr[i],ch);
}

当用户输入超过9个字符时,输入缓冲区将溢出。

推荐:

for(int i=0 ; i<5 ;i++)
{
    char ch[10];
    printf("%d",i);
    scanf("%9s",ch);   <-- notice the change
    strcpy(arr[i],ch);
}

然而,然后它们可以留在stdin中的字符,应该被消耗并且需要消耗任何尾随的空白空间。建议:

for(int i=0 ; i<5 ;i++)
{
    char ch[10];
    printf("%d",i);
    scanf(" %9s",ch);   <-- notice the '9', notice the space
    strcpy(arr[i],ch);
    int trash;
    while( (trash = getchar() ) != EOF && '\n' != trash );
}