当strlen大于sizeof时
最近在看字符串处理函数strcat想到一个问题:strcat(dest,src) 当拼接二者字符串时,需要dest的存储空间大于src
当运行#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "love";
char str2[] = "FishC";
printf("sizeof str1 = %d\n", sizeof(str1));
printf("strlen str1 = %u\n", strlen(str1));
strcat(str1, " ");
printf("sizeof str1 = %d\n", sizeof(str1));
printf("strlen str1 = %u\n", strlen(str1));
strcat(str1, str2);
printf("str1: %s\n", str1);
printf("sizeof str1 = %d\n", sizeof(str1));
printf("strlen str1 = %u\n", strlen(str1));
return 0;
}
发现其结果显示str1的字符长度大于字符的储存,产生了数组越界的问题,希望鱼油大神们能科普下数组越界和内存储存的关系,谢谢~ 看看 新人一枚,说点我知道的吧
字符数组判定结束的标志是\0知道吧,当字符数组长度不够时,会继续按照数组地址连续储存,并在结束后加上\0,这也是为什么定义指针数组的时候可以省略长度,而单独设定一个参数为数组长度。
以题目为例,char str1[] = "love";实际上在内存中一共储存了love\0共计5个元素,此时数组初始化完成,元素固定为5个不变,所以sizeof一直都是5,但是strlen的判定是以\0为结束标志的,计算\0前的字符串个数,当数组长度不够时,会继续连续向后存储,形成连续的字符串,这时str只是相当于字符串数组的地址 谢谢,明白了,其实数组名是固定的地址,如果用指针定义的话其实就变化了 oshapeman 发表于 2016-8-24 19:04
谢谢,明白了,其实数组名是固定的地址,如果用指针定义的话其实就变化了
用指针应该更得不到答案吧
char *p;
sizeof(p) == 4;
这里,sizeof得到的是字符指针的大小
页:
[1]