我遇到了指针问题。我有这样的结构:
typedef struct Concert {
char* nameOfBand;
char* location;} concert;
}
我希望有一个动态的结构数组。
所以我需要创建一个变量来存储一个结构数组,然后向它添加结构。我怎么能这样做?
我试过了:
//pointer to array
concert** concertArray = (concert**) malloc(sizeof(concert)*5);
//new concert
concert newConcert;
newConcert.nameOfBand = "name1";
newConcert.location = "location1";
//adding item to array
*((*concertArray)+0) = newConcert;
但是在编译时失败了。
答案 0 :(得分:0)
此声明
concert** concertArray = (concert**) malloc(sizeof(concert)*5);
没有意义。
请尝试以下
//pointer to array
concert *concertArray = malloc( sizeof( concert[5] ) );
//new concert
concert newConcert;
newConcert.nameOfBand = "name1";
newConcert.location = "location1";
//adding item to array
concertArray[0] = newConcert;
这是一个示范程序
#include <stdio.h>
#include <stdlib.h>
typedef struct Concert
{
char* nameOfBand;
char* location;
} concert;
int main(void)
{
//pointer to array
concert *concertArray = malloc( sizeof( concert[5] ) );
//new concert
concert newConcert;
newConcert.nameOfBand = "name1";
newConcert.location = "location1";
//adding item to array
concertArray[0] = newConcert;
printf( "Name: %s, Location: %s\n",
concertArray[0].nameOfBand, concertArray[0].location );
free( concertArray );
return 0;
}
它的输出是
Name: name1, Location: location1
答案 1 :(得分:0)
通常这里的问题是,你不是在复制newConcert
。您只是将指针器放入数组中的本地(自动)变量,并且当您返回函数时,该指针超出范围(不再存在)。使用malloc
分配一个新的音乐会,然后填写数据(以及每个字符串的malloc !!)。以下是这个,是一个更完整的例子:
typedef struct Concert {
char* nameOfBand;
char* location;
} concert;
concert** concertArray;
int nConcerts;
int main()
{
int i;
concertArray = malloc(sizeof(concert *)*5); // allocate array
addConcert("name1", "location1"); // add element
// print elements
for (i=0; i<nConcerts; i++)
printf("Name: %s, location: %s\n", concertArray[i]->nameOfBand, concertArray[i]->location);
// free concerts
for (i=0; i<nConcerts; i++) {
free(concertArray[i]->nameOfBand);
free(concertArray[i]->location);
free(concertArray[i]);
}
free(concertArray);
return 0;
}
void addConcert(char *name, char *location)
{
concert *newConcert = malloc(sizeof(concert));
newConcert->nameOfBand = malloc(strlen(name)+1); strcpy(newConcert->nameOfBand, name);
newConcert->location = malloc(strlen(location)+1); strcpy(newConcert->location, location);
concertArray[nConcerts++] = newConcert;
}
答案 2 :(得分:0)