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

Cho*_*ois 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

错误是"分段错误:11".

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

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

和额外的问题:

int a = 1;
int* b = &a;
printf("%s", *b);
Run Code Online (Sandbox Code Playgroud)

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

char hi[11] = "message";
printf("%s", hi);
Run Code Online (Sandbox Code Playgroud)

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

非常感谢!

Iha*_*imi 7

因为

char name[11];
Run Code Online (Sandbox Code Playgroud)

意味着创建一个11字符数组,而

char *name;
Run Code Online (Sandbox Code Playgroud)

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

name = malloc(11);
Run Code Online (Sandbox Code Playgroud)

这将指向一个11字符的记忆块.

当你调用scanf它时,期望参数指向有效的内存来写入它.

因此,如果指针未初始化,您不知道它指向的位置,malloc让您访问内存并返回指向它的指针,您将该指针指定给name然后name变为可写但不可读.

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

scanf("%10s", name);
Run Code Online (Sandbox Code Playgroud)

注意"%10s"你防止写入超过允许的内存的方式,它malloc对于数组和数组都是有用的.

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

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

name = malloc(11);
if (name == NULL)
    handleThisAndDontTryToUse_name_Anywhere();
Run Code Online (Sandbox Code Playgroud)

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

/* after you are done using the block of memory */
free(name);
Run Code Online (Sandbox Code Playgroud)

如果是

char name[11];
Run Code Online (Sandbox Code Playgroud)

你不必担心这些事情.

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

char array[11];
char *name = array;
Run Code Online (Sandbox Code Playgroud)

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