首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-02 18:29:15

size的类型更改为char

您使用的是int,当您将指针添加到此处的*(size+i)时,就超出了界限。指针算法考虑了类型,在您的情况下,类型是int而不是char。int的大小比系统上的char大。

票数 2
EN

Stack Overflow用户

发布于 2014-10-02 18:28:57

int *size意味着您需要:

代码语言:javascript
复制
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)

票数 3
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
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26167160

复制
相关文章

相似问题

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