0

私が持っているとしましょう

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

2 つの文字列と 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 は問題ありませんが、2 つの文字列はエラー メッセージをスローします。これを行う正しい方法は何ですか?また、これらの入力間でメモリにオーバーラップがあるかどうかを確認するにはどうすればよいですか (入力された文字列は任意に長くなる可能性がありますか?

4

2 に答える 2

0

thisを見ると、 insert2 にint"H"型 (C では定数)を格納しようとしていることがわかります。言い換えれば、(私のコンパイラで) 型を 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 に答える
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 に答える