c - 如何正确动态分配内存?

标签 c arrays struct segmentation-fault dynamic-allocation

下面的代码是根据来自该站点的示例编写的。我不明白,我做错了什么?你能帮我一下吗?

编译:

gcc -std=c11 main.c

仅打印:

Thing: Boiled buckwheat, weight: 1500

Segmentation fault

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

typedef struct {
    // Weight in grams
    size_t weight;
    // Name of Thing
    char name[255];

} Things;

void add_new_thing(Things **things,size_t *size)
{

    size_t index = *size;

    if(index == 0){
        (*size) = 1;
        *things = (Things*)calloc((*size),sizeof(Things));
        if (*things == NULL) {
            fprintf(stderr, "Error: can't allocate memory! %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
    }else{
        (*size) += 1;
        Things *temp = (Things*)realloc(*things,(*size)*sizeof(Things));
        if(temp != NULL) {
            *things = temp;
        }else{
            fprintf(stderr, "Error: can't reallocate memory! %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
        // Zeroing of new structure's elements
        things[index]->name[0] = '\0';
        things[index]->weight = 0;
    }

}

void another_function(Things *things,size_t *size)
{
    // Add one element to the array of structures
    add_new_thing(&things,size);
    const char *str1 = "Boiled buckwheat";
    strncpy(things[*size-1].name, str1, strlen(str1) + 1);
    things[*size-1].weight = 1500;

    for(size_t i = 0;i < *size;i++){
        printf("Thing: %s, weight: %zu\n",things[i].name,things[i].weight);
    }

    // Add one more element to the array of structures
    add_new_thing(&things,size);
    const char *str2 = "A toy";
    strncpy(things[*size-1].name, str2, strlen(str2) + 1);
    things[*size-1].weight = 350;

    // Segmentation fault is below
    for(size_t i = 0;i < *size;i++){
        printf("Thing: %s, weight: %zu\n",things[i].name,things[i].weight);
    }
}

void some_function(Things *things,size_t *size)
{
    // To pass the array of structures to another function
    another_function(things,size);
}

int main(void)
{

    // Create NULL pointer for the array of structures
    Things *things = NULL;

    // Add size of structures' array which will be allocated within add_new_thing() function
    size_t size = 0;

    // Call some function
    some_function(things,&size);

    // Segmentation fault is below
    printf("Print results:\n");
    for(size_t i = 0;i < size;i++){
        printf("Thing: %s, weight: %zu\n",things[i].name,things[i].weight);
    }

    free(things);

    return(EXIT_SUCCESS);
}

最佳答案

请记住,C 按值调用,这意味着在 main 函数中,您将传递 things 中的空指针副本> 到 some_functionmain 中的实际变量不会改变。

只有在 another_function 中,您才能模拟按引用传递,并且只有在 another_function 中,things 变量才会通过中的分配进行更新add_new_thing

关于c - 如何正确动态分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524003/

相关文章:

使用宏转换结构中整数字段的字节顺序

java - 使用 Java 更新 MongoDB 中的循环数组

c++ - 为什么它不能正确解析 XML 文件?

php - 在插入新数据之前删除表数据

c - C 编程中的结构

c - API 返回结构

c - 关闭 cuda c 中的线程

c - 是否有一种有效且安全的方法来反转数组中的所有元素?

c++ - (OpenCV) 出现 'unresolved external symbol' 错误

arrays - 令人惊讶的数组扩展行为