【问题标题】:Decrease pointer until it points to the first element of array减小指针直到它指向数组的第一个元素
【发布时间】:2018-05-05 15:45:31
【问题描述】:

我使用*ptr 从头到尾迭代一个字符数组(一次一个字节)并设置一些值。当指针指向第一个地址时,算法应该停止。

  char *buf = (char*)malloc(sizeof(char) * 3 + 1);
  char *ptr = &buf[sizeof buf - 1]; // *ptr point to the last address
  *ptr = '\0';

  do {
    if(alfa) {
      *(--ptr) = "teststring"[alfa]; // *ptr decreases value by one
      alfa -= i;
    } else { *(--ptr) = 'N'; }
  } while(*ptr != &buf[0]); // should check if *ptr is now pointing to the start of buf. If that's the case, stop.

但是,在它检查地址是否相等之后,它给了我:

** stack smashing detected **: <unknown> terminated
Aborted (core dumped)

另一个(也许是相关的)事情是:malloc 应该从内存中分配 4 个字节,但是当我检查 sizeof(buf) 时它有 8 个字节(?)。

注意:sizeof(char) * 3 + 1的输出确实是4,但和sizeof(buf)不一样。

【问题讨论】:

  • sizeof buf 并没有给你你认为的那样。它返回 pointer buf 的大小,而不是它所指向的大小。顺便说一句,这仍然适用于指针为四个字节的 32 位系统。它不会在指针为 8 个字节的 64 位系统上工作得很好(如您所见)。
  • 请不要在 C++ 程序中使用malloc/free。使用new/delete。甚至更好;使用智能指针(make_uniquemake_shared 和朋友)和 STL 容器(如 std::arraystd::vector)。您当前的代码读作“使用 C++ 编译器编译的 C”——您可以做得更好。
  • alfa 是如何定义和初始化的?
  • @alk alfa 是一个整数
  • ...并初始化?

标签: c arrays pointers memory


【解决方案1】:

sizeof some_variable 计算为变量的大小。

所以这个sizeof buf 的大小等于bufbuf 是一个指针,它给你 4 或 8,这取决于代码是在 32 位还是 64 位平台上编译的。

要解决您的问题,请更改此设置

  char *buf = (char*)malloc(sizeof(char) * 3 + 1);
  char *ptr = &buf[sizeof buf - 1]; 

到这里

  size_t size = sizeof(char) * 3 + 1;
  char *buf = malloc(size); /* No need to cast void-pointer sin C. */
  char *ptr = &buf[size - 1]; // *ptr point to the last address

考虑到sizeof (char) 的定义等于1,只需这样做:

  size_t size = 3 + 1;
  char *buf = malloc(size); 
  char *ptr = &buf[size - 1]; 

【讨论】:

  • 谢谢。我现在明白为什么它给了我 8 个(而不是 4 个)并更正了它。但是,在比较两个地址后,我的代码仍然给我一个“检测到堆栈粉碎”的错误。
【解决方案2】:

第一个答案是对的,也是你最后的测试:

while(*ptr != &buf[0]);

没有检查ptr 不在缓冲区的第一个位置。那将是ptr != &amp;buf[0] 或只是ptr != buf

您正在查看指针 (*ptr) 处的数据是否不等于缓冲区开头的位置,从而将 char 与指针进行比较。你的编译器可能会给你一个警告。不要忽略 C 中的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多