C - 指向动态结构数组的指针

时间:2017-11-10 15:32:48

标签: c arrays pointers struct

我遇到了指针问题。我有这样的结构:

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;

但是在编译时失败了。

3 个答案:

答案 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)

这行代码...... *((* concertArray)+0)= newConcert; 是相同的.... * concertArray [0] = newConcert; 虽然这使它们成为相同的类型,但是你的代码不会起作用,因为concertArray [0]是一个未定义的指针,你可以解除引用它。 你需要为concertArray的每个元素分配内存,然后你可以使用你在下面的例子中创建的音乐会。 concertArray [0] = malloc(sizeof(音乐会)); concertArray [0] - &gt; nameOfBand =&#34; name1&#34 ;; concertArray [0] - &gt; location =&#34; location1&#34 ;;