我这里有个密码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int *size;
int i = 0;
char buf[] = "Thomas was alone";
size = (int*)calloc(1, sizeof(buf)+1);
for(i=0; i<strlen(buf); i++)
{
*(size+i) = buf[i];
printf("%c", *(size+i));
}
free(size);
}据我理解,calloc保留了一个内存空间,与第一个arg的大小乘以第二个,在本例中为18。buf的长度为17,因此for循环应该没有任何问题。
运行这个程序会得到预期的结果(它只打印Thomas ),但是它也会立即崩溃。除非我放大calloc的大小(就像乘以10 ),否则这种情况仍然存在。
我是不是理解错了什么?我应该使用函数来防止这种情况发生吗?
发布于 2014-10-02 18:29:15
将size的类型更改为char。
您使用的是int,当您将指针添加到此处的*(size+i)时,就超出了界限。指针算法考虑了类型,在您的情况下,类型是int而不是char。int的大小比系统上的char大。
发布于 2014-10-02 18:28:57
int *size意味着您需要:
size = calloc(sizeof(int), sizeof(buf));您为char数组分配了足够的空间,但没有为int数组分配足够的空间(除非您在一个奇怪的sizeof(char) == sizeof(int)系统上,这是理论上的可能性,而不是实际的可能性)。这意味着您的代码编写的代码远远超出了分配的内存的末尾,这就是导致崩溃的原因。或者您可以使用char *size,在这种情况下,对calloc()的原始调用是可以的。
注意,sizeof(buf)包含终端null;strlen(buf)不包含。这意味着您对+1术语的分配略有过高。
您也可以非常明智地编写size[i]而不是*(size+i)。
发布于 2014-10-02 18:53:37
您为char数组分配位置,而不是为int数组分配位置:
所以分配1 * sizeof(buf) + 1 =18个字节
例如,在内存中:
buf = 0x34523
buf1 = 0x34524
buf2 = 0x34525
buf3 = 0x34526
但是,当您使用*(size + 1)时,您不会在1字节上移动指针,而是将大小(Int)移动到4字节。因此,在记忆中,它将看起来像:
尺寸= 0x4560
size1 = 0x4564
size2 = 0x4568
size3 = 0x4572
所以,经过几个循环,你就没有记忆了。
将calloc(1, sizeof(buf) + 1);更改为calloc(sizeof(int), sizeof(buf) + 1);以具有足够的内存。
第二,我认为这是你学习它如何工作的一个例子吗?
我的建议:
*(size+i) = (int)buf[i];。https://stackoverflow.com/questions/26167160
复制相似问题