0

当我把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;
}
4

6 回答 6

1

您需要为name首次使用分配内存malloc

name = malloc(20);
scanf("%19s", name);

然后当你完成后,你应该释放分配的内存:

free(name);
于 2012-12-30T21:55:40.947 回答
0

p3[]自动分配内存,*p3不会。

要使用*p3您必须使用用户malloc功能。

于 2012-12-30T21:55:44.597 回答
0

scanf能够从标准输入获取输入并将其放入 achar*但它不会为您分配内存。

尝试:

char name[64];
scanf("%s",name);

注意char *name不会为字符初始化内存。您需要像 with 一样使用自动分配char name[64]或使用 动态分配它char *name = calloc(64, sizeof(char))。如果您选择后一种方法,您还必须在不再需要时释放内存free(name)

于 2012-12-30T21:56:15.223 回答
0

您声明name为指针,但您从不初始化它。这意味着当您尝试在scanf调用中写入时,您会写入看似随机的内存位置。这是未定义的行为,肯定会导致奇怪的事情发生。

您应该创建一个数组来保存字符串:

char name[32];

此外,为了不超出字符串的末尾,您可能应该将scanf调用更改为,以便它知道长度:

scanf("%31s", name);

如果你得到一条线,你应该使用fgets

fgets(name, sizeof(name), stdin);

并且作为一个小提示:不要忘记检查从您调用的函数返回的值,它们可能会失败!

于 2012-12-30T21:56:21.257 回答
0

name尚未初始化为指向任何东西,因此指向内存中的某个随机位置。使用它会调用未定义的行为。

要么将其声明为数组,要么分配一些内存。

您不应该传入p3其中scanf()任何一个,因为它已被分配为指向静态字符串。

并且永远不要使用gets(). 曾经。

于 2012-12-30T21:56:54.210 回答
0

增加你的编译器警告,它会指出你的错误。name是一个未初始化的指针,所以它可能指向任何地方并试图写入它指向的位置会导致未定义的行为,如果你幸运的话,会出现段错误。

要么声明name为数组,要么初始化它malloc以分配一块内存。

您还应该与说明符一起使用overfgets以避免缓冲区溢出,或者至少传递一个宽度说明符,这样您就不会溢出缓冲区。请注意,如果您使用它,它还将存储在缓冲区中。scanf%sscanffgets'\n'

IE。

char name1[30];
char *name2 = malloc(30 * sizeof(*name2));

fgets(name1, 30, stdin); // TODO - check return values
scanf("%29s", name2); // 30 - 1
//...
free(name2);
于 2012-12-30T21:57:34.073 回答