3

発言に疑問がある

p = my_malloc(4);

my_malloc には p というローカル ポインターがあり、関数がポインターのアドレスを返すと、割り当てが解除されます。では、どのように int* p in main が関数によって返されたアドレスを保持できるのでしょうか。関数が戻るとき、それが使用したアドレスは、他の関数またはプロセスによって使用される場合と使用されない場合があります。以下のプログラムは未定義の動作ですか?

#include<stdio.h>
#include<unistd.h>

void* my_malloc(size_t size){
 void *p;
 p = sbrk(0); 
 p = sbrk(size); // This will give the previous address
 //p = sbrk(0); // This will give the current address
 if(p != (void *)-1){
   printf("\n address of p : 0x%x \n",(unsigned int)p);
 }
 else{
  printf("\n Unable to allocate memory! \n");
  return NULL;
 }
 return p;
}

int main(){
 int* p;
 p = my_malloc(4);
 printf("\n address of p : 0x%x \n",(unsigned int)p);
}
4

2 に答える 2

5

ほとんどの malloc 実装は代わりにmmap (2)使用します。

未定義の動作とは、ローカル変数のアドレスを返すことです。

void* topofstack() {
   char c;
   return &c;
}

また、最近の GCC コンパイラ (4.8 など) では警告が表示されますが、少なくとも-Wall常に使用する必要があります。コールスタックについては、多くの便利なリンクを提供するこの回答を参照してください。

一部の をコーディングするときmallocは、 もコーディングしてください (また、頻繁に syscall を作成しないようにして、可能な場合は-d メモリをfree再利用してください)。既存の malloc フリー ソフトウェア実装のソース コードも調べてください。MUSL libcには、非常に読みやすいmalloc/ ...があります。freemalloc

于 2013-05-13T23:58:39.167 に答える