私はCを書いて以来、長い時間がかかりました。私の理解は、malloc
は、以前にmalloc
と反応しなかった新たに割り当てられたメモリ領域へのポインタを返します。しかし、私のプログラム(下記)は、既に割り振られた領域の中央にポインタを返すことを示しているようです!malloc
!mallocは割り当てられたメモリへのポインタを返す
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int* bla;
int baz;
int qux;
int bar;
} foo;
int main() {
foo* foo = malloc(sizeof(foo));
int* arr = malloc(sizeof(int) * 10);
// my understanding of malloc is that `foo` and `bar` now point to
// non-overlapping allocated memory regions
printf("arr %p\n", arr); // but these print
printf("&(foo->bar) %p\n", &(foo->bar)); // the same address
foo->bar = 42;
printf("arr[0] = %d\n", arr[0]); // prints 42
return 0;
}
私はこれをコンパイルし、実行している:私は間違って何をやっている
$ cc --version
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$ cc main.c -o main
$ ./main
arr 0x7fa68bc
&(foo->bar) 0x7fa68bc
arr[0] = 42
?
でそれを実行した;'回避したであろうこのエラー –
彼はうれしいことに 'foo * foo = malloc(sizeof * foo);' –
'foo * foo =(foo *)malloc(sizeof(foo))'コンパイラが '(foo *)'にエラーを出すので、この問題も回避していました。いくつかのポスターは "mallocをキャストしない"と言っているが、アドバイスの第2部分を忘れる( 'sizeof'式を変更する)のが好きです。 'malloc(sizeof(Type))'は '(Type *)malloc(sizeof(Type))'よりエラーが発生しやすくなります。 –