【问题标题】:segmentation fault after memcpy and freememcpy 和 free 后的分段错误
【发布时间】: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


【解决方案1】:

使用

free(temp-i)

你在循环中增加温度。因此,您没有释放您创建的指针。

更好的方法是

for(i=0;i<5;i++){
    printf("%c\n",*(temp+i));
}
free(temp);

【讨论】:

  • 谢谢。有用。但是我应该每次在释放动态内存之前将指针设置在动态数组的开头吗???
  • 如果修改指针值,可以。但最好保持指针值不变,请参阅我的回答中提到的替代实现。
【解决方案2】:
char name [6]={'a','m', 'i', 'n','f','e'};

请注意,这不是 C 的字符串,因为没有终止字符串字符 '\0'(所以它只是一个字符数组,而不是字符串)。

还有

for (i=0; i<5; i++) {
        printf("%c\n",*temp);
        temp++;
    }

您正在增加指针(访问外部内存部分) 你必须写这个

for (i = 0; i < 5; i++) {
    printf("%c", temp[i]);
    }
printf("\n");

或者更好

printf("%s\n", temp);

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 2019-10-08
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多