0

可能重复:
为什么 c 允许在没有声明的情况下初始化字符串?

我正在尝试这个相当简单的代码:

#include<stdio.h>
void copy(char *,char *);
main() {
char *name;
char *surname;
printf("Enter name: ");
scanf("%s",name);

printf("%s",name);
}    

但是由于某种原因,在我输入名称并按Enter后,程序挂起并给出消息,例如程序已停止工作。但是,当我删除第二个字符指针声明时,即char *surname;,它按预期工作。这里有什么问题?

4

4 回答 4

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);
}
于 2012-10-27T12:35:51.793 回答
2

您正在写入未分配的内存。也就是说undefined behavior

你可以在这里做两件事:

  1. 在编译时将您的字符数组声明为具有固定大小,如下所示:(char name[100];这意味着您不能在运行时更改它们的大小)
  2. char *name为使用malloc()calloc()函数分配空间stdlib.h

在任何情况下,您都必须确保只允许用户输入您分配的字节数,否则可能会发生坏事!

如果您未能定义所述边界,可以在这里找到一个关于邪恶的人可以(并且将会;)做什么的小型研究:http ://www.cultdeadcow.com/cDc_files/cDc-351/

于 2012-10-27T12:35:30.300 回答
1

因为您没有为它分配内存,而您放入其中的字符串会破坏程序的代码。尝试使用sscanfgetline

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

看看这个:

在 C 中读取可变长度字符串用户输入

和这个 :

http://en.wikipedia.org/wiki/Buffer_overflow

于 2012-10-27T12:36:59.647 回答
1

您声明了一个指针并且没有给它一个有效的内存地址,它指向一个随机地址。您不能使用此指针读取或写入。指针应该这样使用:

char s1[100],s2[100];
char * name=s1;
char * surname=s2;
于 2012-10-27T12:39:09.423 回答