c - C char* 数组在内存中是什么样的?

标签 c arrays assembly char arm

我在 ARM 汇编程序中对 char 数组运行 CRC32 多项式除法代码,我开始意识到我的部分代码是基于某些我在检查之前不应该做出的假设。具体来说:

  • 每个字符的大小(1 个字节?)
  • 一般数组的大小

假设这个数组可以无余数地分成多个 32 位字是否公平?另外,如果我修改 C 中的数组以包含比它应有的多 X 个字符(以便被 32 位整除),但不设置这些字符,它们在 ASM 二进制文件中会是什么样子?比如,假设我将数组分配为

    int buffersize = 2000;
    char buffer[buffersize+3];

然后准确地填充数组中的 buffersize 个位置;有什么可以告诉剩下的 3 个字符在内存中的样子吗?我假设它们在第一个 00000000 字节之前,因为那是数组的末尾,对吗?

最佳答案

The size of each char (1 byte?)

是的,在 C 语言中,char 总是 恰好占用一个字节,根据定义 herehere :

1 character single-byte character bit representation that fits in a byte

但是,字节 不一定是八位字节(八位);实现允许使用更大字节...但是,sizeof (char) 始终为 1 并且 char 值始终占用一个字节。


Is it fair to assume that this array will be divisible into a number of 32-bit words without remainder?

如果您在问题中指的是 buffer,则不是。它占用 2003 个字节,而 2003 是奇数,不能被 4 或任何其他偶数整除。


what will they look like in ASM binary?

尝试使用不确定的值是 C 中的未定义行为,因此是与您的编译器、体系结构或操作系统开发人员讨论的主题,而不是与 C 相关的主题。


is there anything to tell what the remaining 3 chars would look like in memory?

未初始化的值是不确定的。尝试使用它们是未定义的行为。


I'd assume they'd be before the first 00000000 byte, as that's the end of the array, is that correct?

如果您指的是终止 '\0' 字节的字符串,那么不,它不必位于数组的末尾。它可以在数组中的任何位置。重要的是要记住它表示字符串的结尾,因此如果您想附加到字符串(即像 strcat 那样),那么您需要移动字符串终止符...

不幸的是,仍然有人信奉 C 字符串是数组的成语。 C标准没有这样说。事实上,C 标准在 some cases 中与此相反。 .

关于c - C char* 数组在内存中是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21480563/

相关文章:

c - 将地址存储到函数指针中

C:分配给指针时数组的行为

arrays - 如何跨嵌套数组过滤 JSON 对象数组

PHP 函数 Preg Match 拉第二张图像而不是第一张图像

javascript - 循环遍历页面中的对象,如果页面包含键,则追加值

c - BCC 中的内联汇编(Bruce 的 C 编译器)- 如何使用 C 变量?

c - 2 个关于 typedef 结构和平均成绩的问题。我在 C 中做得正确吗?

c++ - 从哪里获得简单的开源 adpcm C\C++ 编码器库?

c - linux内核一步一步

assembly - %assign 和 %define 的区别