C 用于获取导致段错误的字符串的双指针

C 用于获取导致段错误的字符串的双指针,c,pointers,char,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

我想输入字符串,但它总是返回段错误

#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);
}
#包括
#包括
#包括
int main()
{
字符**arr;
arr=(char**)malloc(5);

对于(int i=0;i替换这段代码:

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

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

arr= (char** ) malloc (5 * sizeof(char));
也就是说,为5个字符分配大小。 您需要做的是为
arr
的5个char
指针分配空间,这就是为什么您应该使用
sizeof(char*)


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

替换这段代码:

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

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

arr= (char** ) malloc (5 * sizeof(char));
也就是说,为5个字符分配大小。 您需要做的是为
arr
的5个char
指针分配空间,这就是为什么您应该使用
sizeof(char*)

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

关于这些行:

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关于这些行:

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

for(int i=0;iYou正在分配5个字节,但您需要
5*sizeof(char*)
来容纳5个指针。也不要强制转换malloc的输出。一般来说,您可以将其缩短为“不强制转换”。这很危险,您相信用户输入的字符数不会超过9个。调用任何内存分配函数时,请务必检查(!=NULL)返回值以确保操作成功。您正在分配5个字节,但需要
5*sizeof(char*)
来保存5个指针。也不要强制转换malloc的输出。一般来说,您可以将其缩短为“不强制转换”这很危险,您相信用户输入的字符不超过9个。调用任何内存分配函数时,请始终检查(!=NULL)返回值以确保操作成功。
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 );
}