C语言中的函数和数组

加布里埃尔·加西亚(Gabriel Garcia)

我正在学习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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章