一个简单的C代码中的指针数组问题

时间:2012-12-30 21:53:10

标签: c

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

6 个答案:

答案 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);