首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于C中指针和字符串的问题

关于C中指针和字符串的问题
EN

Stack Overflow用户
提问于 2010-12-07 18:15:11
回答 6查看 1.6K关注 0票数 5

可能重复: 在C区吗? str =“…”和char str[N] =“…”?

我有一些让我困惑的代码。

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char* string1 = "this is a test";
  char string2[] = "this is a test";
  printf("%i, %i\n", sizeof(string1), sizeof(string2));
  system("PAUSE"); 
  return 0;
}

当它输出string1的大小时,它会打印4,这是预期的,因为指针的大小是4个字节。但是当它输出string2时,它输出15。我认为数组是一个指针,所以string2的大小应该与string1相同,对吗?那么,为什么它会为同一类型的数据(指针)打印两个不同的大小呢?

EN

回答 6

Stack Overflow用户

发布于 2010-12-07 18:18:21

数组不是指针。在某些情况下,数组名称会衰减为指向数组的第一个元素的指针:当您将数组传递给一个函数时,当您将它分配给一个指针时,等等。但如果不是数组,则数组就是数组--它们存在于堆栈中,具有可以用sizeof确定的编译时大小,以及所有其他好的东西。

票数 13
EN

Stack Overflow用户

发布于 2010-12-07 18:18:41

string1是一个指针,而string2是一个数组。

第二行类似于int a[] = { 1, 2, 3};,它将a定义为一个长度-3数组(通过初始化程序)。

string2的大小是15,因为初始化程序是以nul结尾的(所以15是字符串+1的长度)。

票数 4
EN

Stack Overflow用户

发布于 2010-12-07 18:21:18

对于大小未知的数组,其大小等效于指针。静态大小数组作为自己的类型来计算,大小报告数组所需的存储空间的大小。即使分配string2时没有显式大小,C编译器也会神奇地处理它,因为它是由引用的字符串直接初始化的,并将其转换为具有静态大小的数组。(由于内存没有以任何其他方式分配,所以它毕竟无法做任何其他事情。)静态大小数组是与指针(或动态数组)不同的类型!对于sizeof行为而言,因为C就是这样的。

似乎是相当大的行为的一个不错的参考。

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

https://stackoverflow.com/questions/4380090

复制
相关文章

相似问题

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