sizeof(char str[])的大小、sizeof(char *str)

在C/C++中,数组作为参数传递时,实际上传递的是指向数组第一个元素的指针。如函数中对数组使用sizeof,返回的是指针大小,为4字节。同时指出三种形式的参数完全等价,且传递本质是指针,维数不必要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节 
}

C/C++里数组作为参数时传递的实际上是指向数组第一个元素的指针,因此sizeof(str)返回的是指针的大小,即4。

 

注意以下三种形式的参数是完全等价的:

1

2

3

void Func(char str[100]);

void Func(char str[]);

void Func(char *str);

因为传递的本质上是指针,所以维数也是不必要的。以下调用是完全合法的:

1

2

3

void Func(char str[100]);

char ch[10];

Func(ch);

<think>我们正在讨论C语言中指针和数组的内存分配问题。用户的问题是关于计算字符指针所占内存大小,具体是:`char *str = "1234"; sizeof(str)`的值是多少。 根据引用[1]和引用[2]: - 引用[1]指出,对于字符串数组,`sizeof(str)`会计算整个数组的大小,包括结束符'\0'。例如,`char str[] = "hello";`中,`sizeof(str)`为6(5个字符+1个结束符)。 - 引用[2]区分了两种定义方式: 1. `char *str = "hello";`:这是在常量区存储字符串,str是一个指针变量,指向这个常量字符串。此时,`sizeof(str)`计算的是指针变量本身的大小,而不是它所指向的字符串的大小。 2. `char str[] = "hello";`:这是在栈上定义了一个数组,数组大小为6(包括结束符),此时`sizeof(str)`计算的是整个数组的大小(6字节)。 因此,对于`char *str = "1234";`: - 这里的`str`是一个指针,它存储的是字符串常量"1234"的地址。 - `sizeof(str)`计算的是指针变量`str`本身所占用的内存大小,而不是它所指向的字符串的大小。 那么,指针变量的大小是多少呢? - 在32位系统中,指针大小通常是4字节。 - 在64位系统中,指针大小通常是8字节。 所以,`sizeof(str)`的值取决于编译环境是32位还是64位。 因此,回答应该明确指出: - `sizeof(str)`的值是指针变量的大小,而不是字符串的长度。 - 具体值取决于系统架构(32位或64位)。 另外,用户提供的引用[3]和[4]是关于动态内存分配的,虽然与指针相关,但本题并不涉及动态内存分配,所以主要参考引用[1]和[2]。 最后,按照要求: - 使用中文回答。 - 生成相关问题。 - 在回答中引用的地方添加引用标识。 回答结构: 1. 解释问题:说明`char *str = "1234";`中`str`是一个指针。 2. 指出`sizeof(str)`计算的是指针大小,而不是字符串的大小。 3. 说明指针大小的决定因素(系统位数)。 4. 给出具体值:32位系统下为4字节,64位系统下为8字节。 5. 补充:如果要计算字符串长度,应该用`strlen(str)`,但注意`strlen`不计算结束符,所以长度为4。 然后生成相关问题。</think>### 计算字符指针内存大小 对于代码 `char *str = "1234"; sizeof(str)` 的结果: **`sizeof(str)` 的值是指针变量本身的内存大小**,而非字符串内容的大小。具体结果取决于系统架构: 1. **32位系统**指针固定占 **4字节** - 例:`sizeof(str) == 4` 2. **64位系统**指针固定占 **8字节** - 例:`sizeof(str) == 8` ### 关键原理说明 1. **`char *str` 是指针变量** - `str` 存储字符串常量 `"1234"` 的内存地址(引用[2]) - `sizeof(str)` 始终计算指针的存储空间,与指向的字符串长度无关 ```c char *str = "1234"; // str指针变量 printf("%zu", sizeof(str)); // 输出指针本身的大小(4或8) ``` 2. **字符串长度的正确获取方式** - 需用 `strlen()` 函数(需包含 `<string.h>`): ```c printf("%zu", strlen(str)); // 输出4(不包含结束符\0) ``` - 字符串常量 `"1234"` 实际占用 **5字节**(4字符+1结束符`\0`),但该内存不属于指针变量(引用[1]) 3. **指针与数组的本质区别** | 定义方式 | `sizeof()` 结果 | 内存区域 | 是否可修改 | |-----------------------|------------------------|------------|------------| | `char *str = "1234";` | 指针大小(4/8字节) | 常量区 | ❌ 只读 | | `char str[] = "1234";`| 数组大小(5字节) | 栈区 | ✅ 可修改 | > **总结**:`sizeof(char*)` 恒等于系统指针大小,与指向内容无关。若需字符串长度,必须使用 `strlen()`[^1][^2]。 --- ### 相关问题 1. 如何正确计算C语言中动态分配字符串的内存大小? 2. `sizeof()` 和 `strlen()` 在字符串处理中的根本区别是什么? 3. 为什么修改 `char *str="abc"` 的内容会导致程序崩溃?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值