char name[11]; 之间有什么区别?和字符*名称;
What is difference between char name[11]; and char *name;
下面是查找指向数组的指针的简单代码。
#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
为什么它不起作用?
错误是"segmentation fault : 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
给你访问内存和returns一个指向它的指针,你把那个指针赋值给name
然后 name
变为可写,但还不可读。
它指向的内容还没有定义,所以你也需要初始化它的内容,因为你可以使用
scanf("%10s", name);
注意 "%10s"
这样可以防止写入超出允许的内存,它对 malloc
和数组都有用。
注意:在scanf("%10s", name);
中数字应该是数组可以容纳的字符数-1
,因为你需要一个额外的字符,终止'[=28=]'
.
在对 malloc
的任何调用之后,您应该承担两个责任,首先您必须确保有有效的内存指向,在相反的情况下 malloc
将 return 一个特殊值,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
的第一个元素的指针,从你的问题文本来看,我相信你明白这意味着什么。
char name[11];
分配 11 个字节的可写内存,您可以在其中存储输入。 name
被视为指向该内存的常量指针。
char *name;
为一个名为 name
的指针变量分配 space,它可能会被更改,但它不指向任何东西。
char *name = "Fred";
为字符串 "Fred" 分配指针变量和 5 个字节,但在不可写内存中。
why it doesn't work if i change "char name[11]" --> "char *name" ?
name 是在堆栈上定义的指针,并使用垃圾地址进行初始化,因此它指向一个随机位置,根据它指向的位置,您可能会或可能不会遇到分段错误。即使您没有遇到分段错误,代码仍将被视为有缺陷。
编辑:
What is difference between pointer to array and just pointer?
您的意思可能是数组和指针之间的区别。如果是这样,那么数组的名称是一个常量指针,而指针是一个非常量指针。
下面是查找指向数组的指针的简单代码。
#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
为什么它不起作用?
错误是"segmentation fault : 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
给你访问内存和returns一个指向它的指针,你把那个指针赋值给name
然后 name
变为可写,但还不可读。
它指向的内容还没有定义,所以你也需要初始化它的内容,因为你可以使用
scanf("%10s", name);
注意 "%10s"
这样可以防止写入超出允许的内存,它对 malloc
和数组都有用。
注意:在scanf("%10s", name);
中数字应该是数组可以容纳的字符数-1
,因为你需要一个额外的字符,终止'[=28=]'
.
在对 malloc
的任何调用之后,您应该承担两个责任,首先您必须确保有有效的内存指向,在相反的情况下 malloc
将 return 一个特殊值,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
的第一个元素的指针,从你的问题文本来看,我相信你明白这意味着什么。
char name[11];
分配 11 个字节的可写内存,您可以在其中存储输入。 name
被视为指向该内存的常量指针。
char *name;
为一个名为 name
的指针变量分配 space,它可能会被更改,但它不指向任何东西。
char *name = "Fred";
为字符串 "Fred" 分配指针变量和 5 个字节,但在不可写内存中。
why it doesn't work if i change "char name[11]" --> "char *name" ?
name 是在堆栈上定义的指针,并使用垃圾地址进行初始化,因此它指向一个随机位置,根据它指向的位置,您可能会或可能不会遇到分段错误。即使您没有遇到分段错误,代码仍将被视为有缺陷。
编辑:
What is difference between pointer to array and just pointer?
您的意思可能是数组和指针之间的区别。如果是这样,那么数组的名称是一个常量指针,而指针是一个非常量指针。