【问题标题】:IA 32 AT&T - How to reach the end of a char array without dimension?IA 32 AT&T - 如何到达没有维度的字符数组的末尾?
【发布时间】:2018-12-15 13:40:21
【问题描述】:

我在 C 中有一个函数,它应该找出给定 char 数组中有多少个“X”。 我收到参数中的数组,但我没有收到它的长度

所以在 C 中应该是

countX(char ss[]){
   int i=0; cont=0;
   while(ss[i]!='/0'){
      if(ss[i]=='X') cont++;
      i++;
   }
   return cont;
   }
}

我必须在汇编中实现这一点,但由于我没有数组的长度,我不知道我需要在 cmp 指令中比较什么值才能到达 char 数组的末尾?

【问题讨论】:

  • '/0' 看起来像是一个错字。应该是 '\0' 用于 NUL 终止字符,它也表示结束。假设您正在处理 C 字符串
  • C 中的字符数组不会自动以 '\0' 结尾,所以我不确定这是一个很好的比较。
  • 感谢您的 cmets,我确实注意到它不正确,应该是 '\0'。尽管我同意你的观点,但该代码是在课堂练习中给出的,所以无论情况如何,我都必须处理它。
  • 如果您发布的代码是由您的讲师提供给您的,则需要修正错字。该代码表明该数组以 NUL (0) 终止。您必须扫描值 0(字符串的结尾)和字母“X”。
  • @DavidWohlferd 如果它们代表字符串,这是一个完全有效的假设。

标签: arrays pointers assembly char arguments


【解决方案1】:

这个函数被称为strlen。这是搜索第一个0 字节。

仅当数组以终止 0 字节结尾时才有效,即它是隐式长度的 C 字符串。

这里没有魔法,只是循环直到找到0 字节。

这就是为什么strlen 比指针+长度的显式长度字符串慢的原因。 (不过,strlen 的真正 libc 实现通过手写 asm 进行了优化,可以一次检查 16 或 32 个字节。请参阅 Questions about the performance of different implementations of strlenIs it safe to read past the end of a buffer within the same page on x86 and x64?


对于字符串以外的东西,将指针+长度传递给函数更为常见,例如void foo(float *arr, size_t len);.

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多