首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用calloc并手动输入字符会导致崩溃。

使用calloc并手动输入字符会导致崩溃。
EN

Stack Overflow用户
提问于 2014-10-02 18:25:50
回答 3查看 97关注 0票数 0

我这里有个密码。

代码语言:javascript
复制
#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 ),否则这种情况仍然存在。

我是不是理解错了什么?我应该使用函数来防止这种情况发生吗?

EN

Stack Overflow用户

发布于 2014-10-02 18:53:37

您为char数组分配位置,而不是为int数组分配位置:

  • char是内存中的一个字节(最常见的情况)

  • int是内存中的4个字节(通常是)

所以分配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];
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26167160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档