c - char name[11]; 之间有什么区别?和字符*名称;

标签 c arrays pointers

下面是查找指向数组的指针的简单代码。

#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] 为什么它不起作用 --> 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 的第二个参数是地址本身,而不是上面那样的值。它是什么??为什么会这样?

非常感谢!

最佳答案

因为

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 的第一个元素的指针,从你的问题文本来看,我相信你明白这意味着什么。

关于c - char name[11]; 之间有什么区别?和字符*名称;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933917/

相关文章:

c - 指针类型的char数组的反向引用

c - 为什么我的玩家和电脑总是得到相同的随机数?

C# vs C - 性能差异很大

c - 是否有 strsep() 函数的 Windows 变体?

python - 使用列表和数组制作嵌套字典

javascript - 将数组从多个值简化为更少的值

c - 找到许多子数组的开始和结束的算法?

c - 段错误,指针数组

c++ - C 中的 ip 地址搜索算法或库

c++ - oid 将 double* 转换为 double