可能重复:
why does c allow initialization of string without declaration?
我正在尝试这个相当简单的代码:
#include<stdio.h>
void copy(char *,char *);
main() {
char *name;
char *surname;
printf("Enter name: ");
scanf("%s",name);
printf("%s",name);
}
但由于某些原因,在我输入名称并按Enter
后,程序挂起并发出消息,例如程序已停止工作。但是当我删除第二个字符指针声明时,即char *surname;
,它的工作方式与预期一致。这有什么问题?
答案 0 :(得分:3)
您没有为指针分配内存,因此scanf
访问任意未指定的内存,这是未定义的行为。
您需要将指向足够大的内存块的指针传递给scanf,或者声明
char s1[100], s2[100];
(如果100足够大)或malloc
内存
char *s1 = malloc(100);
char *s2 = malloc(100);
if (!s1 || !s2) {
// malloc failure
exit(EXIT_FAILURE);
}
答案 1 :(得分:2)
您正在写入未分配的内存。那是undefined behavior
,
你可以在这做两件事:
char name[100];
(这意味着您无法在运行时更改其大小)char *name
stdlib.h
分配空间
醇>
在任何情况下,您绝对必须确保您只允许用户输入您分配的字节数,否则可能会发生不好的事情!
如果您未能定义所述边界,可以在此处找到关于邪恶的人可以(并且将会)做什么的小型研究:http://www.cultdeadcow.com/cDc_files/cDc-351/
答案 2 :(得分:1)
因为你没有为它分配内存,而你输入的字符串会破坏程序的代码。尝试使用sscanf和getline:
#include <stdio.h>
int main()
{
int nbytes = 100;
char *my_string;
int int1, int2, int3;
int args_assigned;
args_assigned = 0;
while (args_assigned != 3)
{
puts ("Please enter three integers separated by whitespace.");
my_string = (char *) malloc (nbytes + 1);
getline (&my_string, &nbytes, stdin);
args_assigned = sscanf (my_string, "%d %d %d", &int1, &int2, &int3);
if (args_assigned != 3)
puts ("\nInput invalid!");
}
printf ("\nThanks!\n%d\n%d\n%d\n", int1, int2, int3);
return 0;
}
看看这个:
Reading in a variable length string user input in C
和此:
答案 3 :(得分:1)
你声明一个指针并且不给它一个有效的内存地址,它指向一个随机的addrss。您无法使用此指针读取或写入。指针应该像这样使用:
char s1[100],s2[100];
char * name=s1;
char * surname=s2;