当我将name
作为char指针时出现错误。
当我把它作为一个数组时它很好,但同样的情况是*p3
没有问题。
为什么我只为name
收到错误?即使初始化也不起作用。
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
int dex;
const int k = 5;
char *name;
char *p3 = "happy world";
char *list[k]={"kamy",
"frank",
"chris",
"sara",
"ricky"};
scanf("%s",name);
//or gets(name);
printf("printed name is <%s>", name);
getch();
return 0;
}
答案 0 :(得分:1)
您需要先使用name
malloc
分配内存
name = malloc(20);
scanf("%19s", name);
然后当你完成后你应该释放分配的内存:
free(name);
答案 1 :(得分:0)
p3[]
自动分配内存,*p3
没有。
要使用*p3
,您必须使用malloc
功能。
答案 2 :(得分:0)
scanf
能够从stdin获取输入并将其放在char*
中,但它不会为您分配内存。
尝试:
char name[64];
scanf("%s",name);
请注意char *name
没有为字符初始化内存。您需要像char name[64]
一样使用自动分配,或者使用char *name = calloc(64, sizeof(char))
动态分配。如果您选择后一种方法,那么当您不再需要free(name)
时,您还必须释放内存。
答案 3 :(得分:0)
您将name
声明为指针,但您永远不会初始化它。这意味着当您尝试在scanf
调用中写入时,您会写入一个看似随机的内存位置。这是未定义的行为,绝对会导致奇怪的事情发生。
您应该创建一个数组来保存字符串:
char name[32];
另外,为了不写超出字符串的结尾,您应该更改scanf
调用,以便它知道长度:
scanf("%31s", name);
如果您要换行,则应使用fgets
代替:
fgets(name, sizeof(name), stdin);
作为一个小提示:不要忘记检查您调用的函数返回的值,它们可能会失败!
答案 4 :(得分:0)
name
尚未初始化为指向任何内容,因此指向内存中的某个随机位置。使用它会调用未定义的行为。
将其声明为数组,或者分配一些内存。
您不应该将p3
传递给scanf()
,因为它已被指定为指向静态字符串。
不要使用gets()
。如初。
答案 5 :(得分:0)
增加编译器警告,它会指出你的错误。 name
是一个未初始化的指针,所以它可能指向任何地方,并试图写入它指向的位置将导致未定义的行为,如果你幸运的话,一个段错误。
将name
声明为数组,或使用malloc
初始化它以分配内存块。
您还应该使用fgets
而不是scanf
和%s
说明符来避免缓冲区溢出,或者至少将宽度说明符传递给scanf
,这样就不会溢出缓冲区。请注意,如果您使用fgets
,它还会将'\n'
存储在缓冲区中。
即
char name1[30];
char *name2 = malloc(30 * sizeof(*name2));
fgets(name1, 30, stdin); // TODO - check return values
scanf("%29s", name2); // 30 - 1
//...
free(name2);