我在使用malloc和字符串指针时遇到分段错误

时间:2014-02-07 16:00:55

标签: c pointers segmentation-fault malloc

当我试图使用带有字符串指针的malloc进行扫描时,它会发现一个分段错误

main(){
    char *a;
    a = (char)malloc(50);
    printf("enter a string\t");
    scanf("%s", a);
    printf("%s\n", a);
}

2 个答案:

答案 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指针是否安全。

最后:不要忽略编译器警告。

copy-paste & test here

你可以在页面的右下角提供stdin输入,它会打印你提供的字符串