首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用realloc动态扩展数组

使用realloc动态扩展数组
EN

Stack Overflow用户
提问于 2013-02-26 21:39:22
回答 3查看 6.6K关注 0票数 4

我写了下面的代码来弄清楚malloc和realloc。我已经使用malloc初始化了指针,然后使用realloc,我增加了数组的大小。但是当我运行代码时,我得到了以下错误。

代码语言:javascript
运行
复制
#include<stdio.h>
#include<stdlib.h>

int main()
{
    char *p;
    p = malloc(10);
    p = " this is it";
    printf("\n%s", p);
    p = realloc(p, 14);
    p[11] = 'A';
    p[12] = 'B';
    p[13] = 'C';
    printf("\n %s", p) ;
    return 0;
}

输出:

代码语言:javascript
运行
复制
ajay@ajay-K54L:~$ gcc te.c 
ajay@ajay-K54L:~$ ./a.out

*** glibc detected *** ./a.out: realloc(): invalid pointer: 0x000000000040071c ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e626)[0x7fb111e88626]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x2de)[0x7fb111e8d3ee]
./a.out[0x4005dc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fb111e2b76d]
./a.out[0x4004d9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 3027043                            /home/ajay/a.out
00600000-00601000 r--p 00000000 08:03 3027043                            /home/ajay/a.out
00601000-00602000 rw-p 00001000 08:03 3027043                            /home/ajay/a.out
00e76000-00e97000 rw-p 00000000 00:00 0                                  [heap]
7fb111bf4000-7fb111c09000 r-xp 00000000 08:03 2100801                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111c09000-7fb111e08000 ---p 00015000 08:03 2100801                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111e08000-7fb111e09000 r--p 00014000 08:03 2100801                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111e09000-7fb111e0a000 rw-p 00015000 08:03 2100801                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fb111e0a000-7fb111fbd000 r-xp 00000000 08:03 2100780                    /lib/x86_64-linux-gnu/libc-2.15.so
7fb111fbd000-7fb1121bc000 ---p 001b3000 08:03 2100780                    /lib/x86_64-linux-gnu/libc-2.15.so
7fb1121bc000-7fb1121c0000 r--p 001b2000 08:03 2100780                    /lib/x86_64-linux-gnu/libc-2.15.so
7fb1121c0000-7fb1121c2000 rw-p 001b6000 08:03 2100780                    /lib/x86_64-linux-gnu/libc-2.15.so
7fb1121c2000-7fb1121c7000 rw-p 00000000 00:00 0 
7fb1121c7000-7fb1121e9000 r-xp 00000000 08:03 2100760                    /lib/x86_64-linux-gnu/ld-2.15.so
7fb1123d2000-7fb1123d5000 rw-p 00000000 00:00 0 
7fb1123e5000-7fb1123e9000 rw-p 00000000 00:00 0 
7fb1123e9000-7fb1123ea000 r--p 00022000 08:03 2100760                    /lib/x86_64-linux-gnu/ld-2.15.so
7fb1123ea000-7fb1123ec000 rw-p 00023000 08:03 2100760                    /lib/x86_64-linux-gnu/ld-2.15.so
7ffff08d4000-7ffff08f5000 rw-p 00000000 00:00 0                          [stack]
7ffff09ff000-7ffff0a00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
 this is itAborted (core dumped)

我在内存分配方面做错了什么?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-26 21:42:32

这一点:

代码语言:javascript
运行
复制
p = " this is it"; /* Does not copy, use strcpy(). */

将字符串文本的地址分配给p,并将其从先前由malloc()返回的地址更改。传递给realloc()的指针必须是:

...以前由malloc(),calloc()或realloc()分配的,还没有用free()释放的,否则结果是未定义的。

例如,将赋值更改为strcpy()以更正:

代码语言:javascript
运行
复制
p = malloc(12); /* Increased size. */
if (p)
{
    strcpy(p, " this is it");
    char* tmp = realloc(p, 14);  /* Store result in temp to avoid potential */
    if (!tmp)                    /* in the event that realloc() fails. */
    {
        free(p);
        return -1;
    }
    p = tmp;
    /* snip ... */

    free(p); /* When 'p' is no longer required. */
}
票数 8
EN

Stack Overflow用户

发布于 2013-02-26 21:41:38

您正在使用字符串覆盖由malloc()返回的指针:

代码语言:javascript
运行
复制
p = " this is it";

您应该使用strcpy()将字符串复制到p指向的内存中

代码语言:javascript
运行
复制
strcpy(p, "this is it");

不过请注意,上面的字符串需要的空间比您分配的要多:它有10个可见字符,但是字符串有一个0字符作为终止符,所以您至少需要11个字符的空间。

此外,在依赖指针有效之前,您应该检查malloc()realloc()的返回值。如果是NULL,则分配失败。考虑到您的分配大小,这不太可能,但这是一个很好的实践。

票数 3
EN

Stack Overflow用户

发布于 2013-02-26 21:44:38

代码语言:javascript
运行
复制
char *p = malloc(10);

分配大小为10的内存块,并使p指向此内存。然后

代码语言:javascript
运行
复制
p = " this is it";

定义常量字符串文字,并使p指向存储此常量字符串文字的只读内存。所以

代码语言:javascript
运行
复制
p = realloc(p, 14);

尝试realloc这个产生未定义行为的只读内存。

您应该使用strcpy复制此字符串,而不是将常量字符串的地址分配给p (这也会导致内存泄漏,因为您动态分配的内存地址已丢失)。因此,请替换这一行:

代码语言:javascript
运行
复制
p = " this is it";

有了这个:

代码语言:javascript
运行
复制
strcpy(p, " this is it");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15090567

复制
相关文章

相似问题

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