我想输入字符串,但它会一直返回段错误
#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);
}
并且代码块也不会出错并且完全运行它可以告诉我为什么?
答案 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 );
}