我这里有个密码。
#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: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
复制相似问题