减少指针直到它指向数组的第一个元素

时间:2018-05-05 15:45:32

标签: c arrays pointers memory

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

  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)不同。

2 个答案:

答案 0 :(得分:1)

sizeof some_variable计算变量的大小。

因此sizeof buf评估为buf的大小。如果buf是一个指针,它将为您提供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]; 

答案 1 :(得分:0)

第一个答案是正确的,但也是最后一个测试:

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

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

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