假设我有
void * space= malloc(500) //alloc a block of memory
我需要写两个字符串和一个int:“Hello world”,“Goodbye friend”,5在内存地址50,150,380,对应space。我试过这个方法:
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没有问题,但是两个字符串抛出错误消息。那么这样做的正确方法是什么?另外,如何检查这些输入之间的内存是否重叠(输入的字符串可以是任意长的?
答案 0 :(得分:0)
首先,使用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.
答案 1 :(得分:0)
查看this,我很确定您尝试将类型为 int 的"H"
(这是C中的常量)存储到insert2中。换句话说,您尝试将类型int
(sizeof("H") == 2
存储在我的编译器中)到char(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
这使您的代码更具可读性和实用性。