【发布时间】:2015-05-06 03:22:41
【问题描述】:
我是一名新的 C 程序员。我尝试从静态数组中删除一个元素并将其余元素复制到动态数组中。该程序运行良好,但在free() 之后出现分段错误。我认为指针temp 指向堆栈上的一些内存,这就是我得到分段错误的原因(因为我试图释放一些不是由malloc 创建的东西)。但是问题 memcpy 应该从堆栈复制到堆,以便temp 保持指向堆。代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char name [6]={'a','m', 'i', 'n','f','e'};
char *temp= (char *) malloc(sizeof(char)*5);
memcpy(temp,name1,4);
memcpy(temp+4,name1+5,1);
int i;
for (i=0; i<5; i++) {
printf("%c\n",*temp);
temp++;
}
free(temp);
}
程序的输出是:胺
【问题讨论】:
-
嗯,你在这个程序中没有任何地方调用
free,所以不清楚你所说的“在free()之后我得到一个分段错误”是什么意思。 -
我现在添加了它。它位于代码的末尾
-
temp++表示您没有释放分配的指针。 -
请注意,只有释放
malloc()或calloc()或realloc()或它的副本返回的指针值是安全的;返回分配函数之一未返回给您的指针值是不安全的。像strdup()这样的函数会返回一个指针,就像由malloc()分配的一样,然后您也必须安排释放这些指针。但是你不能释放一个指向已分配内存块中间某处的指针并期望侥幸逃脱。
标签: c segmentation-fault free memcpy