0

トリッキーな構造 ダンプを与えずに反復するポインター

構造ポインタがダンプを与えていない

#include <iostream>
#include <malloc.h>
#include <conio.h>
using namespace std;

typedef struct 
{
 int k;       

}struct1;        

typedef struct 
{
  int i;
  char *ptr;     
  int len;     
  struct1 otherinstance;
}struct2;

int func(struct2 *instance,int y)
{
    int res = 0,i=0;
    for(i=0;i<y;i++)
    {
    instance[i].otherinstance.k = 10;
    printf("Data = %d\n",instance[i].otherinstance.k);
    }    
    return res;        
}


int main()
{
 int x =3;   
 struct2 *instance1 = (struct2*)malloc(sizeof(struct2));
 func(instance1,3);  
 cin.get();  
 return 0;   
}

/*
Output:
Data = 10       
Data = 10
Data = 10       
*/

上記のコードを分析してください。構造体へのポインターを受け入れる関数名「func」があります。関数「func」内で、構造体の配列を反復処理しています:「SHOULD GIVE DUMP」。

ツール: dev c++ ウィンドウ

4

2 に答える 2

2

sizeof(instance1) は n * sizeof(*instance1) である必要があり、なぜ func でクラッシュしないのですか? これは未定義の動作と呼ばれます。malloc から返されたメモリは有効なメモリであり、func 内でアクセスできるため、機能します。リリースビルドや最適化などで実行してみて、いつクラッシュし始めるかを確認してください。

于 2013-10-24T06:10:25.490 に答える
0

未定義の動作。そして、それを使用sizeof(struct2)するmallocと、ほとんどのコンパイラでクラッシュします。

于 2013-10-24T06:15:52.577 に答える