嘿,我正试图创建一个程序,在该程序中,我试图使用指针到指针将元素从一个数组存储到另一个数组,但问题是这是由未定义的行为引起的。我认为问题是我没有以正确的方式将元素传递到成员中我知道这是一种模糊的方法,但它只是出于练习的原因
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student{
char *name;
int *number;
}T;
int main(void) {
char array[10][100]={"araaaa","bbgt","gffkghgh"};
T arr[10][100];
T *p;
T **p1;
p=&arr[0][0];
p1=&p;
int i=0;
for(i = 0 ; i < 3 ; i++)
{ p=arr[i];
strcpy((*p1)->name,array[i]);
}
/*******print_elements*************/
for(i = 0 ; i < 3 ; i++)
{ p=arr[i];
printf("n the elements are %s",(*p1)-> name);
}
return 0;
}
执行此操作时:
strcpy ((*p1)->name, array[i]);
(*p1)->name
是未初始化的指针。因此,所发生的一切都掌握在神的手中。
最简单的修复方法是修改student
结构,使name
成为缓冲区,而不是指针。同时,将number
更改为int
,而不是指向int
::的指针
typedef struct student{
char name [100];
int number;
} T;
如果你想保持name
作为一个指针,那么你必须在将字符串存储在其中之前分配一些内存
(*p1)->name = strdup (array[i]);
完成后不要忘记free
记忆。
T
由两个指针组成,第一个指针指向内存中的字符串。
CCD_ 10是被分配来存储总共1000个T结构的2D阵列。
arr[i]
将参考arr
内的T结构的1D阵列
*p1
本质上就是arr[i]
,因为取消引用p1会得到p
,它刚刚被设置为arr[i]
。因此,这不是指向T
结构的指针,而是指向T
结构的数组的指针。然而,强制强制强制转换可能会为您提供对该行中第一个T
结构的引用。
->name
从不设置此值。您分配了一个数组,但是";name";是指向内存的指针,而不是字符数组,因此'->name"未定义。
我认为您需要将arr
更改为一维数组。你没有使用90%。
并且,您需要初始化该数组中的每个T
结构。您可以使用malloc
或strdup
,然后记得将它们全部释放。或者,将结构设置为使用数组。