2013-04-21 40 views
0

假設我有怎麼寫malloc的內存中的數據用C

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

,我需要寫兩個字符串和一個int:「世界,你好」,「再見朋友」,5在內存地址50150380,對應關係我試過了:

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沒有問題,但是兩個字符串拋出錯誤信息。那麼做這件事的正確方法是什麼?此外,你怎麼能檢查是否有記憶的輸入之間(重疊inputed可以arbitarily長字符串?

回答

0

看着this,我很肯定你試圖將"H"(這是一個常數在C中)int存儲到insert2中。換句話說,你試圖在我的編譯器中存儲一個intsizeof("H") == 2)類型的字符(sizeof(char) == 1)。從那裏,這取決於你的編譯器允許這種行爲或拋出一個錯誤。 Plus "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 

這使得你的代碼更具可讀性和實用性。

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/