结构体指针的指针的问题

时间:2022-11-19 10:44:49
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef struct tagTItem
{
  char  Name[10];
  double Amt;
} TItem;

void getmem(TItem** item)
{
  int i=0;
  item = (TItem**)malloc(2*sizeof(TItem*));
  if (item==NULL) { printf("malloc e.\n"); return; }
  for (i=0; i<2; i++) {
   *(item+i) = (TItem*)malloc(sizeof(TItem));
   sprintf((*(item+i))->Name, "china%d", i+1);
   (*(item+i))->Amt = (i+1)*12.0;
   sprintf((*(item+i))->Name, "china%d", i+1);
   (*(item+i))->Amt = (i+1)*12.0;
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  getmem(itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", (*itm++)->Name);
  }
  free(itm);
  getchar();
  return 0;
}


// 不知道哪里错了,打印的时候就core dump勒,帮忙看看,指针不会用啊

6 个解决方案

#1


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef struct tagTItem
{
  char  Name[10];
  double Amt;
} TItem;

void getmem(TItem** item)
{
  int i=0;
  for (i=0; i<2; i++) 
  {
    *(item+i) = (TItem*)malloc(sizeof(TItem));
    sprintf((*(item+i))->Name, "china%d", i+1);
    (*(item+i))->Amt = (i+1)*12.0;
//    sprintf((*(item+i))->Name, "china%d", i+1);   // 重复
//    (*(item+i))->Amt = (i+1)*12.0;                // 重复
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  // 程序最主要错在把 itm = malloc 放在函数里, 函数结束返回时並不会传回來
  // itm 还是 NULL, 如果要在函数里改 itm 的值, 要传 &itm
  itm = (TItem**)malloc(2*sizeof(TItem*)); 
  if (itm==NULL) 
  { 
  printf("malloc e.\n"); 
  return 0; 
  }
  getmem(itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", (*(itm+i))->Name);        // itm+i
  }
  free(itm);
  getchar();
  return 0;
}

#2


void getmem(TItem** item)
{
  int i=0;
  *item = (TItem*)malloc(2*sizeof(TItem));
  if (item==NULL) { printf("malloc e.\n"); return; }
  for (i=0; i<2; i++) 
  {
   //*(item+i) = (TItem*)malloc(sizeof(TItem));
   sprintf((*item+i)->Name, "china%d", i+1);
   (*item+i)->Amt = (i+1)*12.0;
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem *itm = NULL;  
  getmem(&itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", (itm++)->Name);
  }
  free(itm);
  getchar();
  return 0;
}

#3


不要 定义 2级指针来分配,
定义1级指针传地址就是了 ...

#4


这样写比较容易看懂

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef struct tagTItem
{
  char  Name[10];
  double Amt;
} TItem;

void getmem(TItem *item[])
{
  int i=0;
  for (i=0; i<2; i++) 
  {
    item[i] = (TItem*)malloc(sizeof(TItem));
    sprintf(item[i]->Name, "china%d", i+1);
    item[i]->Amt = (i+1)*12.0;
//    sprintf((*(item+i))->Name, "china%d", i+1);   // 重复
//    (*(item+i))->Amt = (i+1)*12.0;                // 重复
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  itm = (TItem**)malloc(2*sizeof(TItem*)); 
  if (itm==NULL) 
  { 
    printf("malloc e.\n"); 
    return 0; 
  }
  getmem(itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", itm[i]->Name);        // itm+i
  }
  for(i = 0; i<2; i++)
  {
    free(itm[i]);
  }
  free(itm);
  getchar();
  return 0;
}

#5



/*
基本实现了楼主的要求,注意几个问题:
 1、在传指针时一定要传地址,而不是传值,否则会少了一层.所以我多加了一层.
 2、在函数getmem(TItem** item)中,item只是参数itm的一份拷贝,二者属于完全不同的变量。
 3、为了方便理解,可另申请了一个变量,注释掉的部分。
 4、C++ 支持使用&在参数中定义,可方便理解。
 估计楼主想要测试的时在子函数中分配内存,然后想把指针带回来。
 不过你这样用的指针层数太多了,实用性不强。
*/
#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct tagTItem
{  
  int Amt;
} TItem;

void getmem(TItem ***item ){
  int i=0;  
  //TItem **tt;
  //tt = (TItem**)malloc(2*sizeof(TItem*));
  *item = (TItem**)malloc(2*sizeof(TItem*));  
  // if (item==NULL) { printf("malloc e.\n"); return; }
  for(i = 0 ; i<2; i++){
   (*((*(item))+i)) = (TItem*)malloc(sizeof(TItem));   
   (*((*(item))+i))->Amt = 50 + i;    
    printf(" (*((*(item))+i))->Amt = %d \n", (*((*(item))+i))->Amt);
  }
  //*item = tt;  
};
int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  printf("&itm=%x\n", &itm);
  getmem(&itm);
  for(i=0; i < 2; i++)
   printf("[%d]\n", (*itm++)->Amt);  
  
  //free(itm); //不能再free,itm已经飞了.
 // getchar();
  return 0;
}

#6


嗯,明白勒,应该传指针的地址,而不是传指针的拷贝
感谢各位。

#1


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef struct tagTItem
{
  char  Name[10];
  double Amt;
} TItem;

void getmem(TItem** item)
{
  int i=0;
  for (i=0; i<2; i++) 
  {
    *(item+i) = (TItem*)malloc(sizeof(TItem));
    sprintf((*(item+i))->Name, "china%d", i+1);
    (*(item+i))->Amt = (i+1)*12.0;
//    sprintf((*(item+i))->Name, "china%d", i+1);   // 重复
//    (*(item+i))->Amt = (i+1)*12.0;                // 重复
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  // 程序最主要错在把 itm = malloc 放在函数里, 函数结束返回时並不会传回來
  // itm 还是 NULL, 如果要在函数里改 itm 的值, 要传 &itm
  itm = (TItem**)malloc(2*sizeof(TItem*)); 
  if (itm==NULL) 
  { 
  printf("malloc e.\n"); 
  return 0; 
  }
  getmem(itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", (*(itm+i))->Name);        // itm+i
  }
  free(itm);
  getchar();
  return 0;
}

#2


void getmem(TItem** item)
{
  int i=0;
  *item = (TItem*)malloc(2*sizeof(TItem));
  if (item==NULL) { printf("malloc e.\n"); return; }
  for (i=0; i<2; i++) 
  {
   //*(item+i) = (TItem*)malloc(sizeof(TItem));
   sprintf((*item+i)->Name, "china%d", i+1);
   (*item+i)->Amt = (i+1)*12.0;
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem *itm = NULL;  
  getmem(&itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", (itm++)->Name);
  }
  free(itm);
  getchar();
  return 0;
}

#3


不要 定义 2级指针来分配,
定义1级指针传地址就是了 ...

#4


这样写比较容易看懂

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef struct tagTItem
{
  char  Name[10];
  double Amt;
} TItem;

void getmem(TItem *item[])
{
  int i=0;
  for (i=0; i<2; i++) 
  {
    item[i] = (TItem*)malloc(sizeof(TItem));
    sprintf(item[i]->Name, "china%d", i+1);
    item[i]->Amt = (i+1)*12.0;
//    sprintf((*(item+i))->Name, "china%d", i+1);   // 重复
//    (*(item+i))->Amt = (i+1)*12.0;                // 重复
  }
}

int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  itm = (TItem**)malloc(2*sizeof(TItem*)); 
  if (itm==NULL) 
  { 
    printf("malloc e.\n"); 
    return 0; 
  }
  getmem(itm);
  for(i=0; i<2; i++) {
    printf("[%s]\n", itm[i]->Name);        // itm+i
  }
  for(i = 0; i<2; i++)
  {
    free(itm[i]);
  }
  free(itm);
  getchar();
  return 0;
}

#5



/*
基本实现了楼主的要求,注意几个问题:
 1、在传指针时一定要传地址,而不是传值,否则会少了一层.所以我多加了一层.
 2、在函数getmem(TItem** item)中,item只是参数itm的一份拷贝,二者属于完全不同的变量。
 3、为了方便理解,可另申请了一个变量,注释掉的部分。
 4、C++ 支持使用&在参数中定义,可方便理解。
 估计楼主想要测试的时在子函数中分配内存,然后想把指针带回来。
 不过你这样用的指针层数太多了,实用性不强。
*/
#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct tagTItem
{  
  int Amt;
} TItem;

void getmem(TItem ***item ){
  int i=0;  
  //TItem **tt;
  //tt = (TItem**)malloc(2*sizeof(TItem*));
  *item = (TItem**)malloc(2*sizeof(TItem*));  
  // if (item==NULL) { printf("malloc e.\n"); return; }
  for(i = 0 ; i<2; i++){
   (*((*(item))+i)) = (TItem*)malloc(sizeof(TItem));   
   (*((*(item))+i))->Amt = 50 + i;    
    printf(" (*((*(item))+i))->Amt = %d \n", (*((*(item))+i))->Amt);
  }
  //*item = tt;  
};
int main(int argc, char* argv[])
{
  int i = 0, n = 0;
  TItem **itm = NULL;  
  printf("&itm=%x\n", &itm);
  getmem(&itm);
  for(i=0; i < 2; i++)
   printf("[%d]\n", (*itm++)->Amt);  
  
  //free(itm); //不能再free,itm已经飞了.
 // getchar();
  return 0;
}

#6


嗯,明白勒,应该传指针的地址,而不是传指针的拷贝
感谢各位。