C char *数组在内存中的含义是什么?

时间:2014-01-31 12:53:04

标签: c arrays assembly char arm

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

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

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

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

然后在数组中填充完全缓冲区位置;有没有什么可以告诉剩下的3个字符在内存中会是什么样子?我假设它们在第一个00000000字节之前,因为这是数组的结尾,这是正确的吗?

1 个答案:

答案 0 :(得分:2)

  

每个字符的大小(1个字节?)

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

  

1个字符   可以容纳一个字节的单字节字符位表示形式

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


  

假设此数组可以被分割为32位字而没有余数,是否公平?

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


  

它们在ASM二进制文件中是什么样?

尝试使用不确定的值是C中未定义的行为,因此,与您的编译器,体系结构或OS开发人员(而不是与C一起讨论)也是一个主题。


  

有什么东西可以告诉您剩下的3个字符在内存中是什么样子?

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


  

我认为它们应该在第一个00000000字节之前,因为那是数组的末尾,对吗?

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

很不幸,看到仍然有人赞成C字符串是数组的习惯用法。 C标准没有这么说。实际上,C标准类型在some cases中与此相反。