sizeof
原文发表于2009年2月5日 标题是《一个自己犯的C/C++错误》 以前自己写程序时经常犯的错误,后来才开始重视起来,为了更好的说明这个错误,我将演示代码贴出来: 可以看出,表面上这个错误是关于在函数内部将传参指向的缓冲区清零的,调试上述程序后发现主函数里定义的缓冲区被全部成功设置为0,而将这个缓冲区地址传入函数func_test后只有前4个字节被置0,那么问题出在哪里呢?问题就在sizeof上,在主函数上sizeof算得缓冲区为11(包含字符串结尾\0),而函数func_test里算得是4,很明显只是计算的指针的大小。 疑惑就在这里,buffer是数组名不就是地址吗,为什么传参后sizeof值就不算整个数组的大小而只算指针的大小呢? 其实这个问题很容易buffer是数组名,sizeof(数组名)算得的是整个数组占用的字节数,一旦赋值给任何指针(函数传参也相当于一种赋值),也就算的是这个指针的占用空间,和数组就没任何关系了。若还是算的事数组占用空间,那这个指针的占用就没办法计算了
很久以前曾经被wchar的问题在iOS和Android上被坑过,这次是在参研一份有年头的代码时又遇到了宽字符的问题,当然,也是和wchar有关系的,就是这个wchar在各个系统平台下的sizeof问题,关键的是一段UTF-8转UTF-16的代码: wchar_t cp; 这段代码在win下可以正常将utf-8的char*转换为utf-16的char*,但在Android iOS下却不能得到和win下一样的转换结果,刚发现这个问题时,以为又是当年遇到的wchar坑,宽字符函数不支持之类的,但是仔细看了下并没有用到什么字符串函数,转换部分也是自己实现的,最后在各平台调试器的帮助下找到了问题:
请问上面这个题目,哪里有出问题,这是面试官问新进人员的题目之一,看也知道这程式丢到 Dev-C++ 是不会过的,a b 都是宣告为整数指标型态,可是在 a=1 或 b=1 在 Dev-C++ 里面是编译不过的,但是那写法是没有错的,就像你设定 a=0 或者是 a=NULL 是一样意思,不过最好是不要这样写,assignment 这样写不太好,可以改成 a = (int )1; b = (int )1; 这样就可以顺利编译通过,再来 printf("%d\n"a+b); 这行错很大,指标相加会爆炸吧,如果程式这样写,不把 OS 搞挂,那我还会觉得怀疑呢,正确写法是指标加上 offset(位移),这样才是可以正确执行的,所以我们把程式改成下面: 最后的执行结果是 5,(int) b 就相当于 sizeof(b) 也等于 sizeof(int ) 答案都是四,所以就是 1+4 =5,指标是不能相加的,只能透过 offset 方式来让指标指向不同 base,但是如果是指标相减,那就是求 offset 的意思喔,看一下底下例子 要算 offset 也非常容易,只要先转成 10 进位相减在除以 sizeof(int *) 这样就可以求出结果了,a-b 除以四其实 -2.5 取补数,所以是 -3,如果是 b-a 就是整数3了,只是位移 3 个 bit,其实观念就是这样,指标位址不能相加,但是指标位址可以相减 = Offset,观念大致上是这样,最后补上完整程式,大家可以 run 一次看看就知道了
原文发表于2009年2月5日 标题是《一个自己犯的C/C++错误》 以前自己写程序时经常犯的错误,后来才开始重视起来,为了更好的说明这个错误,我将演示代码贴出来: 可以看出,表面上这个错误是关于在函数内部将传参指向的缓冲区清零的,调试上述程序后发现主函数里定义的缓冲区被全部成功设置为0,而将这个缓冲区地址传入函数func_test后只有前4个字节被置0,那么问题出在哪里呢?问题就在sizeof上,在主函数上sizeof算得缓冲区为11(包含字符串结尾\0),而函数func_test里算得是4,很明显只是计算的指针的大小。 疑惑就在这里,buffer是数组名不就是地址吗,为什么传参后sizeof值就不算整个数组的大小而只算指针的大小呢? 其实这个问题很容易buffer是数组名,sizeof(数组名)算得的是整个数组占用的字节数,一旦赋值给任何指针(函数传参也相当于一种赋值),也就算的是这个指针的占用空间,和数组就没任何关系了。若还是算的事数组占用空间,那这个指针的占用就没办法计算了
很久以前曾经被wchar的问题在iOS和Android上被坑过,这次是在参研一份有年头的代码时又遇到了宽字符的问题,当然,也是和wchar有关系的,就是这个wchar在各个系统平台下的sizeof问题,关键的是一段UTF-8转UTF-16的代码: wchar_t cp; 这段代码在win下可以正常将utf-8的char*转换为utf-16的char*,但在Android iOS下却不能得到和win下一样的转换结果,刚发现这个问题时,以为又是当年遇到的wchar坑,宽字符函数不支持之类的,但是仔细看了下并没有用到什么字符串函数,转换部分也是自己实现的,最后在各平台调试器的帮助下找到了问题:
原文发表于2009年2月5日 标题是《一个自己犯的C/C++错误》 以前自己写程序时经常犯的错误,后来才开始重视起来,为了更好的说明这个错误,我将演示代码贴出来: 可以看出,表面上这个错误是关于在函数内部将传参指向的缓冲区清零的,调试上述程序后发现主函数里定义的缓冲区被全部成功设置为0,而将这个缓冲区地址传入函数func_test后只有前4个字节被置0,那么问题出在哪里呢?问题就在sizeof上,在主函数上sizeof算得缓冲区为11(包含字符串结尾\0),而函数func_test里算得是4,很明显只是计算的指针的大小。 疑惑就在这里,buffer是数组名不就是地址吗,为什么传参后sizeof值就不算整个数组的大小而只算指针的大小呢? 其实这个问题很容易buffer是数组名,sizeof(数组名)算得的是整个数组占用的字节数,一旦赋值给任何指针(函数传参也相当于一种赋值),也就算的是这个指针的占用空间,和数组就没任何关系了。若还是算的事数组占用空间,那这个指针的占用就没办法计算了
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始
sizeof是一个在c语言中经常使用的操作符,它是一个在编译期处理的一元运算符,用来计算计算机分配给操作数的内存大小。sizeof的返回值通常是一个由size_t定义的无符号整型常量(可能是unsigned long long)。它可以应用于基本数据类型(int 、char等)、指针类型以及复合数据类型(structure、union等) 复合数据类型: 当操作数为复合数据类型例如 structure union 等时,sizeof()返回计算机寻址单位(通常是8)的整数倍(方便快速查找数组位置)
很久以前曾经被wchar的问题在iOS和Android上被坑过,这次是在参研一份有年头的代码时又遇到了宽字符的问题,当然,也是和wchar有关系的,就是这个wchar在各个系统平台下的sizeof问题,关键的是一段UTF-8转UTF-16的代码: wchar_t cp; 这段代码在win下可以正常将utf-8的char*转换为utf-16的char*,但在Android iOS下却不能得到和win下一样的转换结果,刚发现这个问题时,以为又是当年遇到的wchar坑,宽字符函数不支持之类的,但是仔细看了下并没有用到什么字符串函数,转换部分也是自己实现的,最后在各平台调试器的帮助下找到了问题:
这是在上看到的一个问题。下面这段小程序的本意是打印出数组中的所有成员: 但是实际的运行结果却不是这么回事。如果编译并运行这段程序的话,你看不到任何输出