我正在学习C为Linux开发,并且正在尝试从作为函数参数的数组中获取sizeof()。该的sizeof总是返回8(即一个指针的大小),这样的问题是,在C所有参数都是指针?如果这段代码没有错,那是什么?
#include <stdio.h>
#include <stdlib.h>
int println(char text[]);
int main()
{
char text[] = "Helloabc";
int x = println(text);
x = x + 48;
char y[] = { (char)x };
printf("%s\n", y);
return 0;
}
int println(char text[])
{
int size = sizeof(text) / sizeof(text[0]);
int size1 = sizeof(text);
int size2 = sizeof(text[0]);
printf("%i\n", size1);
printf("%i\n", size2);
return size;
}
这段代码产生以下返回:
8
1
8Helloabc
也出于某些怪异的原因打印“ Helloabc”。
1)首先,在C语言中,并非每个参数都是一个指针。
2)sizeof以字节为单位返回数据类型的大小。
3)在这里,size1是指向字符数组的指针的大小。请在评论部分中查看Aaron的回复。我的错。我需要复习我的C。
4)size2是字符数组中字符的大小。由于字符占用1个字节,因此size2 = 1。
5)打印y时得到“ 8Helloabc”的原因是因为在C中,字符串必须以空值结尾。也就是说,字符串必须以字符'\ 0'结尾。否则,printf函数将不知道何时“停止”阅读和打印字符。
该行在char text[] = "Helloabc";
数组末尾隐含一个空字符'\ 0'。但是,您的代码char y[] = { (char)x };
却没有。
碰巧,“ Helloabc”字符串存储在内存中y值的“之后”,因此printf读取的值超过了“ 8”的值,并继续打印,直到它到达“ helloabc”末尾的空字符为止。有时,您可能不太幸运,并且当未正确填充要尝试从中读取的存储器printf时,打印y可能会给您造成垃圾或分段错误。
只需将代码更改为:char y[] = {(char) x, '\0'};
使其仅输出x的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句