char name [11]之间有什么区别;和char * name;

时间:2015-01-14 00:21:05

标签: c arrays pointers

Belows是一个简单的代码,用于查找指向数组的指针。

#include <stdio.h>
typedef unsigned short int Ushort;

void InputYear(char (*name), Ushort *year);

int main(int argc, const char * argv[]) {
    Ushort year;
    char name[11] ;    

    InputYear(name, &year);

    printf("MY name is %s", message);
    printf("%d", year);
}

void InputYear(char (*name), Ushort *year){
    printf("please enter your name and year");
    scanf("%s %hd" ,name, year);
}

但问题是,如果我改变char name[11] - >&gt;它为什么不起作用? char *name

错误是“分段错误:11”。

我了解到数组的名称也是指示第一个数组值的地址的指针。在这方面,我认为char name[11]char *name是相同的。

或者有什么我不知道的吗?

和额外问题:

int a = 1;
int* b = &a;
printf("%s", *b);

它有效。关键是printf的第二个参数是值本身,而不是地址。但是,

char hi[11] = "message";
printf("%s", hi);

在这种情况下,printf的第二个参数是地址本身,而不是像上面那样的值。它是什么??为什么会这样?

非常感谢你!

3 个答案:

答案 0 :(得分:7)

由于

char name[11];

表示创建11个字符的数组,而

char *name;

意味着,创建一个指针并稍后在某处指向它,然后你可以这样做

name = malloc(11);

这将指向11字符的内存块。

当你调用scanf时,它希望参数指向要写入的有效内存。

因此,如果指针未初始化,您不知道它指向何处,malloc使您可以访问内存并返回指向它的指针,您将该指针指定给name并且然后name变得可写,但还不可读。

它指向的内容尚未定义,所以你需要初始化它的内容,因为你可以使用

scanf("%10s", name);

注意"%10s"以防止写入允许的内存的方式,它对malloc和数组都有用。

注意:在scanf("%10s", name);中,数字应该是数组可以容纳的字符数-1,因为您需要一个额外的字符,终止'\0'

在调用malloc后,您应该承担两种责任,首先必须确保指向有效的内存,相反的情况malloc将返回一个特殊值, NULL,因此对malloc的正确调用将是

name = malloc(11);
if (name == NULL)
    handleThisAndDontTryToUse_name_Anywhere();

第二件事是,系统将获得指针指向的内存的所有权,直到您决定可以释放它为止,您需要调用它free()

/* after you are done using the block of memory */
free(name);

的情况下
char name[11];

你不必担心这些事情。

你可以做的三件事是创建数组并用char *name;指向它我的意思是

char array[11];
char *name = array;

现在name是指向array的第一个元素的指针,根据您的问题文本,我相信您明白这意味着什么。

答案 1 :(得分:0)

char name[11];

分配11个字节的可写内存,您可以在其中存储输入。 name被视为指向该内存的常量指针。

char *name;

为名为name的指针变量分配空间,该变量可能会被更改,但它并不指向任何内容。

char *name = "Fred";

为字符串&#34; Fred&#34;分配指针变量和5个字节,但是在不可写的内存中。

答案 2 :(得分:0)

  

如果我改变“char name [11]” - >&gt;为什么它不起作用“char * name”?

name是在堆栈上定义的指针,并使用垃圾地址进行初始化,因此它指向一个随机位置,并且根据指向的位置,您可能会或可能不会出现分段错误。即使您没有出现分段错误,代码仍将被视为有缺陷。

编辑:

  

指向数组的指针和指针之间有什么区别?

你可能意味着数组和指针之间的差异。如果是这种情况,则数组的名称是常量指针,指针是非常量指针。