「Hello World」は、コンパイラによって静的に割り当てられます。これはプログラムの一部であり、プログラムによってアドレス可能な場所に存在します。アドレス 12 と呼びます。
charVoidPointer は、最初は malloc によって割り当てられた場所を指しています。アドレス 98 と呼びます。
charVoidPointer = "Hello ..." は、charVoidPointer がプログラム内のデータを指すようにします。以前に charVoidPointer に含まれていたアドレス 98 を追跡できなくなります。
また、malloc によって割り当てられていないメモリを解放することはできません。
私が意味することをより文字通りに示すには:
void* charVoidPointer = malloc(sizeof(char) * 256);
printf("the address of the memory allocated for us: %p\n", charVoidPointer);
charVoidPointer = "Hello World";
printf("no longer the address allocated for us; free will fail: %p\n",
charVoidPointer);
あなたが意味したのは:
strcpy(charVoidPointer, "Hello World");
編集:他のタイプのメモリのアドレス指定の例
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
// an array of 10 int
int *p = (int*)malloc(sizeof(int) * 10);
// setting element 0 using memcpy (works for everything)
int src = 2;
memcpy(p+0, &src, sizeof(int));
// setting element 1 using array subscripts. correctly adjusts for
// size of element BECAUSE p is an int*. We would have to consider
// the size of the underlying data if it were a void*.
p[1] = 3;
// again, the +1 math works because we've given the compiler
// information about the underlying type. void* wouldn't have
// the correct information and the p+1 wouldn't yield the result
// you expect.
printf("%d, %d\n", p[0], *(p+1));
free (p);
}
実験; 型を int から long、または double、または何らかの複合型に変更します。