【问题标题】:how to write data within malloc memory in C如何在C中的malloc内存中写入数据
【发布时间】:2013-04-21 18:02:13
【问题描述】:

假设我有

void * space= malloc(500) //alloc a block of memory

我需要写两个字符串和一个int:“Hello world”,“Goodbye friend”,5在内存地址50,150,380,对应空间。我尝试了这种方法:

int * insert = (int *)(space +380);
*insert = 5;

char * insert2 = (char *)(space+50);
*insert2 = "Hello world";

char * insert3 = (char *)(space + 150);
strcpy(insert3,"Goodbye friend");

int 没有问题,但是两个字符串抛出错误信息。那么正确的方法是什么?另外,如何检查这些输入之间是否存在内存重叠(输入的字符串可以任意长?

【问题讨论】:

    标签: malloc strcpy


    【解决方案1】:

    查看this,我很确定您尝试将int 类型的"H"(C 中的常量)存储到insert2 中。换句话说,您试图将类型int(我的编译器上的sizeof("H") == 2)存储到一个字符(sizeof(char) == 1)中。从那里开始,由您的编译器决定是否允许此行为或引发错误。加上"Hello world"是一个不可变的字符串,它只存在于ROM中,所以无论如何你都不能直接修改字符串。

    为了演示,我跑了:

    printf("val:%d\n", "H");
    printf("val:%d\n", "He");
    printf("val:%d\n", "He");\\note 2nd instance the same
    printf("val:%d\n", "Hel");
    printf("val:%d\n", "Hell");
    printf("val:%d\n", "Hello");
    printf("val:%d\n", "Hello ");
    printf("val:%d\n", "Hello W");
    printf("val:%d\n", "Hello Wo");
    printf("val:%d\n", "Hello Wor");
    printf("val:%d\n", "Hello Worl");
    printf("val:%d\n", "Hello World");
    

    产量:

    val:4196404
    val:4196406
    val:4196406\\note 2nd instance the same
    val:4196409
    val:4196413
    val:4196418
    val:4196424
    val:4196431
    val:4196439
    val:4196448
    val:4196458
    val:4196469
    

    正如@Rasmus 所说:

    char * insert2 = (char *)(space+50);
    strcpy(insert2 , "Hello world\0");// the '\0' if changing strings
    

    应该可以解决问题。


    但是,除了模糊/难以辨认,更不用说浪费内存(除非你把它全部计算出来)之外,我没有看到太多实际用途,所以我建议只使用struct

    struct blockOfMem{
        int num;
        char* str1;
        char* str2;
    };
    ....
    struct blockOfMem space;
    space.num = 5;
    strcpy(space.str1, "Hello world\0");// the '\0' if changing strings
    strcpy(space.str2, "Goodbye friend\0");// the '\0' if changing strings
    

    这使您的代码更具可读性和实用性。

    【讨论】:

      【解决方案2】:

      首先,使用 strcpy 我可以编译您的代码。

      void * space= malloc(500); //alloc a block of memory
      int * insert = (int *)(space +380);
      *insert = 5;
      
      char * insert2 = (char *)(space+50);
      strcpy(insert2 , "Hello world");
      
      char * insert3 = (char *)(space + 150);
      strcpy(insert3,"Goodbye friend");
      

      我会使用 strlen 来获取字符串的长度,然后使用 sizeof(char)。要获得分配多少:

      malloc(sizeof(int)+sizeof(char)*(1+strlen(string1))); // 1+ since you need to count the \0. 
      

      http://www.cplusplus.com/reference/cstring/strlen/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 2017-10-03
        • 2015-08-31
        • 1970-01-01
        相关资源
        最近更新 更多