我使用*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)
不同。
答案 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语言中的警告。