繁体   English   中英

在C中使用Malloc和指针成员错误

[英]Use of Malloc in C and pointer member error

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

struct Album {
    char* title;
} 

int main(){
    int i, size;

    struct Album* pAlbum;
    printf("Enter the number of album: ");
    scanf_s("%d", &size);

    pAlbum = malloc(sizeof(pAlbum) * size);

    for(i=0; i<size; i++) {
        printf("Enter the album title: ");
        scanf_s("%p", pAlbum[i].title);
    }

    free(pAlbum);
    return 0;
}

我想让用户输入想要的专辑名称。 错误是scanf对于pAlbump[i].tittle只出现一次。 我分配的内存不正确吗?

pAlbum = malloc(sizeof(pAlbum) * size);

这将分配size 指针 但是您希望分配size 结构

因此,您的分配应为

pAlbum = malloc(sizeof(*pAlbum) * size);

要么

pAlbum = malloc(sizeof(struct Album) * size);

要么

pAlbum = calloc(size, sizeof(struct Album));

处理完之后,您将需要分配内存以将每个字符串存储在结构中。 这将需要单独调用malloc

for(i=0; i<size; i++) {
    printf("Enter the album title: ");
    pAlbum[i].title = malloc(...); // you need to decide how much to allocate
    scanf_s("%s", pAlbum[i].title); // hmm, this simply begs a buffer overrun ...
}

然后,您需要先释放在该循环中分配的每个title字符串,然后再释放结构数组。

在语句中使用结构的数据成员标题之前

    scanf_s("%p", pAlbum[i].title);

您必须分配此数据成员将指向的内存以及要将输入的数据存储在何处。

并且您必须在语句中的名称Album之前使用标签struct

pAlbum = malloc(sizeof( struct pAlbum) * size);

而是输入说明符"%p"您必须使用%s来输入字符串。

首先,如果您不打算在结构中添加额外的成员,则只需将char*向外拉并使用它即可。 如果要将该类型称为Album,则可以编写typedef char *Album; 您正在分配内存来保存指向字符串的指针,而不是保存实际字符串的内存。 您的scanf使用错误的%p格式,使用%s读取字符串。 scanf正在读取未分配的内存,这将导致运行时错误。

要为n项目分配内存,请使用calloc (用于连续分配)。 callocn元素的数组分配一个内存块,每个元素的长度为elem_size个字节。

calloc(n, elem_size);

您应该知道每个标题有多少字节,或者在代码中使用最大字节数。 有一个功能可以为您处理内存分配,但这不是标准的一部分。 它称为strdup

您有两个选择,使title成员成为固定大小的数组

struct Album {
   char title[100];
} 

并以这种方式使用scanf_s

scanf_s("%99s", pAlbum[i].title, _countof(pAlbum[i].title));

或者,使用malloc

char tmp[100];
if (scanf_s("%99s", tmp, _countof(tmp)) == 1)  
    pAlbum[i].title = strdup(tmp);

另外,要分配size结构,请按照David Heffernan的说法进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM