0

假设我有

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 没有问题,但是这两个字符串会抛出错误信息。那么正确的方法是什么?此外,您如何检查这些输入之间是否存在内存重叠(输入的字符串可以任意长?

4

2 回答 2

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. 

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

于 2013-04-21T18:17:45.203 回答
0

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

为了演示,我跑了:

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

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

于 2013-04-21T19:31:51.613 回答