获取char指针内容的长度

如果能确定所指变量为字符串地址,可以用strlen(p)取得字符串长度。

 

strlen能返回字符串的长度是因为它认为到'\0'就是结束的地方

sizeof和内存无关,只根据数据类型来判断,而数据类型的长度和操作系统有关

1

char* a = "c:\\temp\\a.txt\n";

int b = strlen(a);

 

2

char a[] = "hello world";

char *p  = a;

cout<< sizeof(a) << endl; // 12字节

cout<< sizeof(p) << endl; // 4字节

 

计算数组和指针的内存容量

 

void Func(char a[100])

{

cout<< sizeof(a) << endl; // 4字节而不是100字节

}

这里 数组退化为指针

 

 

3

char  buffer[100];

char* p = buffer ;

 

int bufsize = sizeof( buffer ) / sizeof( *p ) ;

可以看到,bufsize是100,得到了那个数组的大小。或者这些写更直观:

int bufsize = sizeof( buffer ) / sizeof( buffer[0] ) ;

<think>好的,用户现在问的是如何获取char*字符内容长度。之前他们问过关于const char*作为函数参数的问题,现在可能是在继续学习C语言中的字符串处理。 首先,我需要确定用户的基础。他们可能知道char*是指向字符的指针,但不太清楚如何正确获取长度。常见的做法是用strlen函数,但用户可能不知道其中的细节,比如strlen计算的是直到空字符'\0'的长度,而如果字符串没有正确终止,会导致问题。 接下来,要考虑用户可能的错误用法。比如,如果他们自己分配了内存但忘记添加'\0',或者处理的是二进制数据而不是字符串,这时候strlen就不适用了。这时候需要提醒用户注意这些情况,并提供替代方法,比如手动遍历或者存储长度信息。 另外,用户可能在使用C++,所以需要指出C和C++中的区别,比如使用std::string的情况。虽然问题标记为C,但有时候用户可能混淆两者,所以提到C++的解决方案也是有帮助的。 还要注意安全性问题,比如缓冲区溢出的风险,使用strlen_s这样的安全函数。但需要说明这是C11标准,可能不是所有编译器都支持。 用户的需求可能不仅仅是知道用strlen,而是理解背后的原理和潜在的问题。因此,需要分步骤解释,从标准方法到注意事项,再到特殊情况的处理,确保他们全面理解。 最后,总结时要强调正确终止字符串的重要性,以及根据使用场景选择合适的长度获取方法。可能用户在实际编程中遇到了问题,比如读取未终止的字符串导致崩溃,这时候需要给出实际例子和解决方案。</think>获取`char*`字符内容长度的正确方法及注意事项如下: --- ### 一、标准方法:使用`strlen`函数 ```c #include <string.h> // 必须包含头文件 char *str = "Hello"; // 示例字符串 size_t length = strlen(str); // 返回值为5(不包含结尾的'\0') ``` #### 原理: - 遍历内存直到遇到`\0`(空终止符) - **时间复杂度**:O(n),需遍历整个字符串 - **返回值类型**:`size_t`(无符号整型) --- ### 二、关键注意事项 1. **必须确保字符串合法**: ```c char bad[3] = {'A','B','C'}; // ❌ 无终止符 strlen(bad); // 导致未定义行为(可能无限循环) ``` 2. **指针检测**: ```c char *ptr = NULL; size_t len = (ptr != NULL) ? strlen(ptr) : 0; // ✅ 安全写法 ``` 3. **动态内存场景**: ```c char *dyn = malloc(10); strcpy(dyn, "test"); printf("%zu", strlen(dyn)); // ✅ 输出4(但实际分配了10字节) ``` --- ### 三、特殊场景处理 #### 场景1:二进制数据 ```c unsigned char data[5] = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; size_t data_len = sizeof(data); // ✅ 正确获取5字节长度 ``` - **注意**:`strlen`不适用于含`\0`的非字符串数据 #### 场景2:预知长度 ```c
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值