c编程结构指针的动态分配

c编程结构指针的动态分配,c,memory-management,dynamic-memory-allocation,realloc,C,Memory Management,Dynamic Memory Allocation,Realloc,程序将输入“1z”读取为(str+0)->输入名称,“2y”读取为(str+1)->输入名称,“3x”读取为(str+2)->输入名称。现在我要做的是在(str+0)->input\u name中插入一个新字符串,而不删除初始元素。所以初始值(str+0)->input\u name将变成(str+1)->input\u name,(str+1)->input\u name变成(str+2)->input\u name,(str+2)->input\u name变成(str+3)->input\

程序将输入“1z”读取为(str+0)->输入名称,“2y”读取为(str+1)->输入名称,“3x”读取为(str+2)->输入名称。现在我要做的是在(str+0)->input\u name中插入一个新字符串,而不删除初始元素。所以初始值(str+0)->input\u name将变成(str+1)->input\u name,(str+1)->input\u name变成(str+2)->input\u name,(str+2)->input\u name变成(str+3)->input\u name。我该怎么做

初始化项目

产品数量:3

输入名称:1z

输入名称:2y

输入名称:3x

输出

1->1z

2->2y

3->3x

=====================

输入:4a

输出

1->4a

2->2y

3->3x

4->你好

我想做的是:

输出

1->4a

2->1z

3->2y

4->3x

我该怎么办

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000

struct input{
  char input_name[SIZE];
};

int main(){    
  int i, startNum;
  struct input *str;
  char _startNum[SIZE];
  char _mode[SIZE];

  fputs("****Choose Menu****\n", stderr);    
  fputs("\n**Initialize items**\nNumber of products: ", stderr);
  fgets(_startNum, SIZE, stdin);
  startNum = atoi(_startNum);

  str = (struct input*)malloc(startNum * sizeof(struct input));
  if (str == NULL){
    printf("Memory allocation error\n");
    exit(EXIT_FAILURE);
  }

  for(i = 0; i < startNum; i++){
    printf("Enter name: ");
    fgets((str+i)->input_name, sizeof(struct input), stdin);
  }
  printf("\n");


  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  printf("\n");

  startNum++;

  strcpy((str+startNum-1)->input_name, "Hello");
  for(i = startNum - 1; i = 0; i--){
    strcpy((str+i)->input_name,(str+i-1)->input_name);
  }

  fputs("Input: ", stderr); 
  fgets((str+0)->input_name, SIZE, stdin);

  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  fputs("\n", stderr);

  return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义大小1000
结构输入{
字符输入_名称[大小];
};
int main(){
int i,startNum;
结构输入*str;
char_startNum[尺寸];
字符模式[大小];
FPUT(“****选择菜单******\n”,标准);
FPUT(“\n**初始化项目**\n产品编号:”,标准);
fgets(标准、尺寸、标准);
startNum=atoi(_startNum);
str=(结构输入*)malloc(startNum*sizeof(结构输入));
如果(str==NULL){
printf(“内存分配错误\n”);
退出(退出失败);
}
对于(i=0;iinput_name,sizeof(struct input),stdin);
}
printf(“\n”);
fputs(“\n**输出**\n”,标准);
对于(i=0;i%s”,i+1,(str+i)->输入\u名称);
}
printf(“\n”);
startNum++;
strcpy((str+startNum-1)->输入名称“Hello”);
对于(i=startNum-1;i=0;i--){
strcpy((str+i)->输入名称,(str+i-1)->输入名称);
}
FPUT(“输入:”,标准偏差);
fgets((str+0)->输入名称、大小、标准输入);
fputs(“\n**输出**\n”,标准);
对于(i=0;i%s”,i+1,(str+i)->输入\u名称);
}
FPUT(“\n”,标准);
返回退出成功;
}

如果我理解正确,那么您需要以下内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000

struct input{
  char input_name[SIZE];
};

int main( void )
{    
  int i, startNum;
  struct input *str;
  char _startNum[SIZE];
  char _mode[SIZE];

  fputs("****Choose Menu****\n", stderr);    
  fputs("\n**Initialize items**\nNumber of products: ", stderr);
  fgets(_startNum, SIZE, stdin);
  startNum = atoi(_startNum);

  str = (struct input*)malloc(startNum * sizeof(struct input));
  if (str == NULL){
    printf("Memory allocation error\n");
    exit(EXIT_FAILURE);
  }

  for(i = 0; i < startNum; i++){
    printf("Enter name: ");
    fgets((str+i)->input_name, SIZE, stdin);
  }
  printf("\n");


  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  printf("\n");

  startNum++;


  struct input tmp =  realloc(str, startNum * sizeof(struct input));
  if (tmp == NULL){
    printf("Memory reallocation error\n");
    exit(EXIT_FAILURE);
  }

  str = tmp;

  strcpy((str+startNum-1)->input_name, "Hello");
  for(i = startNum - 1; i != 0; i--){
    strcpy((str+i)->input_name,(str+i-1)->input_name);
  }

  fputs("Input: ", stderr); 
  fgets((str+0)->input_name, SIZE, stdin);

  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  fputs("\n", stderr);

  free( str );

  return EXIT_SUCCESS;
}
其中使用赋值代替比较

也不是这个电话

fgets((str+i)->input_name, sizeof(struct input), stdin);
一般来说,您必须使用

fgets((str+i)->input_name, sizeof((str+i)->input_name), stdin);


如果我理解正确,那么您需要以下内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000

struct input{
  char input_name[SIZE];
};

int main( void )
{    
  int i, startNum;
  struct input *str;
  char _startNum[SIZE];
  char _mode[SIZE];

  fputs("****Choose Menu****\n", stderr);    
  fputs("\n**Initialize items**\nNumber of products: ", stderr);
  fgets(_startNum, SIZE, stdin);
  startNum = atoi(_startNum);

  str = (struct input*)malloc(startNum * sizeof(struct input));
  if (str == NULL){
    printf("Memory allocation error\n");
    exit(EXIT_FAILURE);
  }

  for(i = 0; i < startNum; i++){
    printf("Enter name: ");
    fgets((str+i)->input_name, SIZE, stdin);
  }
  printf("\n");


  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  printf("\n");

  startNum++;


  struct input tmp =  realloc(str, startNum * sizeof(struct input));
  if (tmp == NULL){
    printf("Memory reallocation error\n");
    exit(EXIT_FAILURE);
  }

  str = tmp;

  strcpy((str+startNum-1)->input_name, "Hello");
  for(i = startNum - 1; i != 0; i--){
    strcpy((str+i)->input_name,(str+i-1)->input_name);
  }

  fputs("Input: ", stderr); 
  fgets((str+0)->input_name, SIZE, stdin);

  fputs("\n**Output**\n", stderr);  
  for(i = 0; i < startNum; i++){
    printf("%d -> %s", i+1, (str+i)->input_name);
  }
  fputs("\n", stderr);

  free( str );

  return EXIT_SUCCESS;
}
其中使用赋值代替比较

也不是这个电话

fgets((str+i)->input_name, sizeof(struct input), stdin);
一般来说,您必须使用

fgets((str+i)->input_name, sizeof((str+i)->input_name), stdin);


您可能想阅读以下内容:使用
perror
-而不仅仅是
printf
-在出现故障时(例如
malloc
…)感谢您的帮助,alk和Basile Starynkevitch!您可能想阅读以下内容:使用
perror
-而不仅仅是
printf
-在出现故障时(例如
malloc
…)感谢您的帮助,alk和Basile Starynkevitch!谢谢你,弗拉德!我得到如下错误:(44)错误c2440'='无法从'void'转换为'input',(45)错误C2676:二进制'=':'input'未定义此运算符,(50)错误c2440'='无法从'input'转换为'input'。第(44)行是您使用realloc定义tmp的行。我不知道该如何修复此问题。你知道吗?在我将行更改为:struct input tmp;tmp=(结构输入)realloc(str,startNum*sizeof(结构输入));非常感谢你,弗拉德!!谢谢你,弗拉德!我得到如下错误:(44)错误c2440'='无法从'void'转换为'input',(45)错误C2676:二进制'=':'input'未定义此运算符,(50)错误c2440'='无法从'input'转换为'input'。第(44)行是您使用realloc定义tmp的行。我不知道该如何修复此问题。你知道吗?在我将行更改为:struct input tmp;tmp=(结构输入)realloc(str,startNum*sizeof(结构输入));非常感谢你,弗拉德!!