我正在学习 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”。
最佳答案
通常数组不同于指针。但是,当作为参数传递时,数组将转换为指针。如果你想得到数组的大小,你应该将它作为另一个参数传递,或者在数组中设置一个标记并手动计算大小。
至于为什么打印“Helloabc”,是因为你的char y[]
没有\0
作为字符串的结尾。因此,当您将 printf
y 作为字符串(通过 %s
)时,它会一直运行直到找到 \0
。
然后会发生什么?注意x,y和text都是在栈上的,栈是从内存高位到内存低位的。所以你的堆栈现在看起来像这样:
(我举了一个错误的例子,发现不是这样,抱歉。现在我修正了它。)
所以,printf
首先输出0x38('8')
。然后继续“Helloabc”,最后找到 '\0'
。
这就是你得到“8Helloabc”的原因。
关于c - C 中的函数和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17607857/