2

私のプログラムは次のような構造になっています。

struct point
{
  int x;
  int y;
}*ptt;

struct point *pointer(int c, int d)
{
  ptt->x = c;
  ptt->y = d;
  return ptt;
}
int main ()
{
  struct point *pqq;
  pqq = ptt;         // Not too sure about this
  pqq = pointer(100,123);
  printf("Pointer value is %d\n",pqq->x);
  return 0;
}

ポインターの呼び出し中にプログラムがクラッシュするようになりました。x と y を初期化する方法ptt->xが間違っているのではないかと思いますが、それらを初期化する正確な方法についてはよくわかりません。ここで何が問題なのですか?

4

5 に答える 5

3

構造体とポインタ関数の変更が許可されていない場合は、main() の小さな変更が機能するはずです

int main ()
{
 struct point *pqq;     

/* ptt is a global pointer visible to main and malloc returns a valid address of type struct point with out which you can not assign a value to its variable */
 ptt = malloc(sizeof(struct point));   

/* pqq = ptt is not necessary - the below statement does that already  */
 pqq = pointer(100,123);
 printf("Pointer value is %d\n",pqq->x);
 return 0; 
 }
于 2013-01-08T07:47:09.417 に答える
1

ポインタを使用する前にメモリを割り当て、そのポインタを使用する必要がなくなったときに解放する必要があります。コードに沿って私のコメントを見つけてください。

int main ()
{
  struct point *pqq=NULL;//Good practice to assign uninitialized pointers with a NULL
  //Before using the ptt pointer allocate memory
  ptt=malloc(sizeof(struct point));
  //Handle the memory allocation failed error
  ptt->x=ptt->y=0;//Good practice
  pqq = ptt;//both pqq and ptt point to same allocated address          
  pqq = pointer(100,123);//And this statement makes the earlier statement pqq=ptt useless. :)
  printf("Pointer value is %d\n",pqq->x);
  free(pqq);
  free(ptt);
  return 0;
}

これがお役に立てば幸いです。

于 2013-01-08T07:39:54.720 に答える
1

use as below:

int main ()
{
   struct point p;
   ptt = &p;
   struct point *pqq;
   pqq = pointer(100,123);
   printf("Pointer value is %d\n",pqq->x);

   return 0;
 }

your code was showing error at ptt->x because you are using pointer to a structure variable "ptt" without initializing. you should initialize that using structure variable, so that it is pointing to the structure , then you can access the members of the structure using pointer variable i.e ptt.

于 2013-01-08T11:36:09.267 に答える
0

オンライン コンパイラのスクリーンショットポインタ用にメモリを割り当てる必要があります。

 struct point
  {
      int x;
     int y;
  }*ptt;

 struct point *pointer(int c, int d)
 {
   ptt=malloc(10);
   ptt->x = c;
   ptt->y = d;
 return ptt;
}
int main ()
{
  struct point *pqq;        
 pqq = pointer(100,123);
 printf("Pointer value is %d\n",pqq->x);
 return 0; 
 }
于 2013-01-08T07:19:33.047 に答える