使用动态内存分配将元素添加到数组

问题描述 投票:0回答:3

我想在这里简单地为

feld[N]
添加一个元素,但我不知道如何做。我在 Internet 上搜索帮助,但没有任何帮助。如果有人能给我一两个提示,那就太棒了。

可能是我没有正确使用

realloc()
,但我不确定。

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

#define MAX_NAME_LEN 50
#define N 20
    
struct student {
    unsigned int nummer;
    char name[MAX_NAME_LEN];
};
    
typedef struct student student_t;
    
int element_vergleich(const void* p1, const void* p2)
{
    student_t* sp1, * sp2;
    sp1 = (student_t*)p1;
    sp2 = (student_t*)p2;
    if (sp1->nummer < sp2->nummer)
        return -1;
    else if (sp1->nummer > sp2->nummer)
        return 1;
    else
        return 0;
}
    
void sortiere(student_t* f, int n)
{
    qsort(f, n, sizeof(student_t), element_vergleich);
}
    
int main(void)
{
    student_t feld[N] = { {59112, "Peter Lustig"}, {45181, "Fritz Fuchs"}, {38984, "Bibi Blocksberg"},
                            {87191, "Bernd Brot"}, {58731, "Katie Sommer"}, {75442, "Hein Klug"} };
    int n = 6;   // Anzahl benutzter Elemente im Feld

    printf("Das Feld wurde fuer %d Elemente deklariert. Davon werden %d Elemente benutzt.\n", N, n);
    
    int i;

    for (i = 0; i < n; i++)
    {       
        printf("Element [%d]: Matrikelnummer: %d\tName Student: %s\n", i + 1, feld[i].nummer, feld[i].name);
    }

    printf("Geben Sie einen neuen Student_t Element ein.\n");
    printf("Geben Sie Matrikelnummer ein: ");
    scanf("%d", &feld->nummer);
    printf("Geben Sie Name des Studenten ein: ");
    scanf("%s", &feld->name);
    
    int* ptr;

    ptr = realloc(ptr, sizeof(student_t) * 7);

    feld[7].name = { "Linas Dagys" };
    feld[7].nummer) = 50846;
    
    return 0;
}
arrays c struct dynamic-memory-allocation
3个回答
0
投票

此代码错误:

int* ptr;

ptr = realloc(ptr, sizeof(student_t) * 7);

int* ptr;
定义了
ptr
但没有赋予它任何值。当
ptr
传递给
realloc
时,它的值是不确定的。您应该传递
realloc
一个值,该值要么是空指针,要么是指向先前分配的内存的指针(先前调用
malloc
realloc
或相关例程返回的地址)。

函数内部,

student_t feld[N] = …;
定义了一个自动存储时长的数组。这不是
realloc
打算改变的东西。要使用大小可能会改变的数组,您应该使用
malloc
realloc
或相关例程为其分配空间,之后您可以使用
realloc
请求更改分配。

您不需要从定义的数组开始,而是从一个指针开始,您通过调用

malloc
realloc
或相关例程为其赋值。 (您可以使用
realloc
通过向其传递一个空指针来进行初始分配。)指针的类型应该是指向数组中所需元素类型的指针 (
student_t
)。
int *
不是处理
student_t
结构数组的正确类型。

然后你可以用数据填充分配的内存,你可以从定义和初始化的数组或通过其他方式复制它。

一旦你有了这个数组,你就可以使用

realloc
来改变它的大小。


0
投票

对于初学者,你有一个错字:

feld[7].nummer) = 50846;
            ^^^^

在此声明中:

student_t feld[N] = { {59112, "Peter Lustig"}, {45181, "Fritz Fuchs"}, {38984, "Bibi Blocksberg"},
                          {87191, "Bernd Brot"}, {58731, "Katie Sommer"}, {75442, "Hein Klug"} };

由于常量

20
定义为
,所以您声明了一个包含 
N

个元素的数组
#define N 20

只有

6
数组元素被显式初始化。数组的所有其他元素都由零隐式初始化。

数组初始化元素的索引是

[0,5]
.

因此,如果您想显式分配数组的另一个元素,则无需“重新分配”数组。数组不能重新分配。它具有自动存储期限,而不是分配的存储期限。

这段代码片段

int* ptr;

ptr = realloc(ptr, sizeof(student_t) * 7);

调用未定义的行为,因为在调用

ptr
时使用的指针
realloc
未初始化。其次,代码片段在任何情况下都没有意义,因为指针
ptr
除了这个代码片段外没有任何地方使用,并且与声明的数组没有任何共同之处。

您只需为数组

feld
的元素赋值,索引为
6
.

注意数组没有赋值运算符。要将字符串存储在字符数组中,您需要将其复制到数组中。

所以你应该写:

#include <string.h>

//...

strcpy( feld[6].name, "Linas Dagys" );
feld[6].nummer) = 50846;

如果你想动态重新分配一个数组,那么最初你需要使用函数动态分配它

malloc
.


-2
投票

我知道 realloc() 函数有一些问题,所以我建议您创建另一个使用 malloc 而不是 realloc 的专用函数或循环。 还有一些语法错误,例如“feld[7].nummer)”末尾的括号。

© www.soinside.com 2019 - 2024. All rights reserved.