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 );
}