【问题标题】:why this C code is crashing为什么这个 C 代码会崩溃
【发布时间】:2016-03-30 18:24:27
【问题描述】:
#include <stdio.h>
#include<stdlib.h>
void *mymemmove(const char *str1,const char* str2,int n)
{
    char *tmp = (char*)malloc(sizeof(char)*n);
    memcpy(tmp,str2,n);
    memcpy(str1,tmp,n);
    free(tmp);
    return NULL;
}

int main(void) {
    // your code goes here
    char *p1,*p2,*p3,*p4;
    //p1= (char *)malloc(sizeof(char)*30);
    p1="ankitagrawal";
    p2=p1+2;
    char *tmp = (char*)malloc(sizeof(char)*13);
    memcpy(tmp,p1,13);
    memcpy(p2,tmp,13);
    printf("p1 = %s /n p2= %s tmp =%s",p1,p2,tmp);
    //mymemmove(p2,p1,13);
    //printf("p1 = %s /n p2= %s",p1,p2);
    return 0;
}

我的代码在 main 函数的第二个 memcpy 中崩溃。谁能告诉我代码有什么问题?

【问题讨论】:

  • p2 指向一个文字字符串,该字符串是无法修改的内存。所以memcpy(p2,tmp,13) 是未定义的行为。见stackoverflow.com/q/164194/12711
  • 即使合法,将 13 个字节复制到 p1+2; 写入超出其界限。
  • 字符串常量通常放在受保护的内存中。您不能像这段代码那样尝试修改它们。
  • 由于多个严重的错误而崩溃。
  • char p1[200] = "ankitagrawal";开头

标签: c debugging crash runtime-error memcpy


【解决方案1】:

通过使用 p2=p1+2 然后尝试从 p2 中 memcpy 13 个字节,将超出为 p2 分配的内存 2 个字节,这肯定会产生错误。

考虑下面的代码:

    char *p1, *p2, *p3, *p4;
    p1 = "ankitagrawal";
    p2= (char *)malloc(14);
    memcpy(p2, p1 + 2, 14);
    printf("\np2 = %s", p2);
    char *tmp = (char*)malloc(14);
    memcpy(tmp, p1, 14);
    memcpy(p2, tmp, 14);
    printf("p1 = %s \np2= %s \ntmp = %s", p1, p2, tmp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多