当我试图使用带有字符串指针的malloc进行扫描时,它会发现一个分段错误
main(){
char *a;
a = (char)malloc(50);
printf("enter a string\t");
scanf("%s", a);
printf("%s\n", a);
}
答案 0 :(得分:3)
a = (char)malloc(50);
在这里,您打算将其类型转换为char *
而不是char
。
请注意,最好不要转换malloc
的返回类型。见Do I cast the result of malloc?
答案 1 :(得分:2)
您的主问题,除了使用scanf
之外,您要将指针(分别在32位或64位系统上的大小为4或8)转换为{{ 1}},根据标准保证大小为1。 不要忽略编译器警告 。你应该看到以下内容:
char
将指针类型转换为warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
a = (char) malloc(10);
warning: assignment makes pointer from integer without a cast [enabled by default]
a = (char) malloc(50);
,仅将其指定给指针变量没有任何意义。如果你想明确表示你正在分配足够的内存以容纳N个字符,那么你可以写:
char
但是一个字符总是大小为1,就像我之前说过的那样。无论如何:我着手修复你发布的代码:
以下复制粘贴代码可以正常工作,前提是您输入的字符不超过49个:
a = malloc(50 * sizeof(char));
//or better still
a = malloc(50 *sizeof *a);//50 times the size of whatever type a is pointing to...
但实际上,look into alternatives to scanf
和永远不会将#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char *a = malloc(50);
if (a == NULL) return EXIT_FAILURE;//<-- no memory available
printf("enter a string\t");
scanf("%s", a);
printf("%s\n", a);
free(a);//<== be tidy, free your memory, though here, it's a bit redundant
return 0;
}
返回的指针强制转换为C. C ++是另一回事。
另外,检查NULL指针是否安全。
最后:不要忽略编译器警告。
你可以在页面的右下角提供stdin输入,它会打印你提供的字符串