首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符a[] =?字符串?;和字符*p =?字符串?;?

字符a[] =?字符串?;和字符*p =?字符串?;?
EN

Stack Overflow用户
提问于 2012-02-27 13:03:02
回答 7查看 69.1K关注 0票数 51

正如标题所说,两者的区别是什么?

代码语言:javascript
复制
char a[] = ?string?; and 
char *p = ?string?;  

这个问题是在面试中被问到的。我甚至不理解这句话。

代码语言:javascript
复制
char a[] = ?string?

这里什么是?运算符?它是字符串的一部分,还是有特定的含义?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-09 19:22:22

第一个是数组,另一个是指针。

数组声明char a[6];请求留出六个字符的空间,名为a。也就是说,有一个名为a的位置,可以容纳六个字符。另一方面,指针声明char *p;请求一个保存指针的位置。该指针名为p,可以指向任何位置的任何字符(或连续的字符数组)。

这些语句

char a[] = "string";char *p = "string";

将导致数据结构可以表示为:

+--+-+--+-+ a:|s|t|r|i|n|g| \0 |+--++-+-++ p:| *======> |s|t|r|i|n|g |\0 |+--+-+--+

重要的是要认识到,根据x是数组还是指针,像x[3]这样的引用会生成不同的代码。根据上面的声明,当编译器看到表达式a[3]时,它会发出从a位置开始的代码,将三个元素移过该位置,并获取该位置的字符。当它看到表达式p[3]时,它发出代码从位置p开始,获取那里的指针值,将三个元素大小添加到指针,最后获取指向的字符。在上面的示例中,a[3]p[3]恰好都是字符l,但编译器的实现方式不同。

来源:

票数 88
EN

Stack Overflow用户

发布于 2012-02-27 13:28:50

代码语言:javascript
复制
char a[] = "string";

这将在堆栈上分配字符串。

代码语言:javascript
复制
char *p = "string";

这将在堆栈上创建一个指针,该指针指向进程的数据段中的文字。

?是写它的人,而不知道他们在做什么。

票数 12
EN

Stack Overflow用户

发布于 2012-06-22 15:09:39

堆栈、堆、数据分段(和BSS)和文本分段是进程内存的四个部分。所有定义的局部变量都将在堆栈中。使用malloccalloc动态分配的内存将在堆中。所有的全局变量和静态变量都将在数据段中。文本段将包含程序的汇编代码和一些常量。

在这4个段中,文本段是READ ONLY段,在所有其他三个段中是READWRITE段。

char a[] = "string"; -此状态将为堆栈中的7个字节分配内存(因为是局部变量),并将保留所有6个字符(s, t, r, i, n, g)和末尾的空字符(\0)。

char *p = "string"; -此语句将为堆栈中的4个字节(如果它是32位机器)分配内存(因为这也是一个局部变量),并且它将保存值为"string"的常量字符串的指针。这6个字节的常量字符串将在文本段中。这是一个常量值。指针变量p只指向该字符串。

现在a[0] (索引可以是0到5)意味着,它将访问堆栈中该字符串的第一个字符。所以我们也可以在这个位置写。a[0] = 'x'。此操作是允许的,因为我们在堆栈中有READ WRITE访问。

但是p[0] = 'x'会导致崩溃,因为我们只能通过READ访问文本分割。如果我们在文本段上做任何写操作,就会发生分割错误。

但是您可以更改变量p的值,因为它是堆栈中的局部变量。如下所示

代码语言:javascript
复制
char *p = "string";
printf("%s", p);
p = "start";
printf("%s", p);

这是允许的。这里,我们将存储在指针变量p中的地址更改为字符串start的地址(同样,start也是文本段中的只读数据)。如果你想修改*p中的值,那就去修改动态分配的内存。

代码语言:javascript
复制
char *p = NULL;
p = malloc(sizeof(char)*7);
strcpy(p, "string");

现在允许p[0] = 'x'操作,因为我们现在是在堆中写入。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9460260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档