首页 文章

在C中使用malloc分配动态内存

提问于
浏览
0

我'm new to C and have been trying to tackle this question. It'是the last thread I made的延续 . 我取得了一些进展,但仍然需要学习和修复 .

简而言之:

在这个问题中,“向量”是整数的一维数组 . 因此,矢量数组将是一个二维数组,其中包含一维数组 .

我需要使用这些变量:

  • int ** vectors - 2D数组

  • int size -an整数,表示**向量中存在多少向量

  • int * sizes - 一个1D的整数数组,表示向量的长度

我需要编写以下函数:

  • **int init(int vectors, int sizes, int size)
    函数将内存分配给
    向量和
    大小和大小,并初始化向量以充满NULL,并将大小填充为零 .

  • **int set(int *vectors, int sizes, int index, int tmp, int tmp_size)
    函数接收一个空数组(向量)),释放其索引为索引的向量内的向量,并为新向量分配内存,其长度为tmp_size并放置在其中
    tmp的元素 .

这是我的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int init(int*** vectors, int** sizes, int size)
{
    int i, k,j;
    *sizes = (int*)malloc(size * sizeof(int));
    if (*sizes == NULL)
        return 0;
    for (j = 0; j < size; j++)
    {
        (*sizes)[j] = 0;
    }

    *vectors = (int**)malloc(size * sizeof(int*));
    if (*vectors == NULL)
        return 0;
    for (i = 0; i < size; i++)
    {
        (vectors)[i] = NULL;
    }
    return 1;
}
int set(int **vectors, int *sizes, int index, int *tmp, int tmp_size)
{
    if ((vectors)[index] != NULL)
    {
        free((vectors)[index]);
    }
    (vectors)[index] = (int*)malloc(tmp_size * sizeof(int));
    if ((vectors)[index] == NULL)
        return 0;
    for (int b = 0; b < tmp_size; b++)
    {
        (vectors)[index][b] = tmp[b];
    }
    sizes[index] = tmp_size;
    return 1;
}
int main()
{
    int size, i, length, indexhere;
    int** vectors = NULL;
    int* sizes = NULL;
    int* tmp = NULL;
    int* p = &vectors;
    int tempindex;
    printf("\nPlease enter an amount of vectors:\n");
    scanf("%d", &size);
    init(p, &sizes, size);

        printf("Enter index\n");
        scanf("%d", &indexhere);
        printf("Enter Length\n");
        scanf("%d", &length);
        tmp = (int*)malloc(length * sizeof(int));
            printf("Enter elements:\n");
            for (int g = 0; g < length; g++)
                scanf("%d", &tmp[g]);
            set(&vectors, sizes, indexhere, tmp, length);

    system("pause");
    return 0;
}

有人可以解释为什么程序总是崩溃?

3 回答

  • 1
    • init 函数 (vectors)[i] = NULL; 实际应该是 (*vectors)[i] = NULL;

    • main 调用 set 函数时,应该传递 vectors 而不是 &vectors .

    你的代码中似乎也有几个指针类型不匹配,所以你应该注意编译器的警告 . 这是因为不幸的是,C允许在不兼容的指针之间进行隐式转换,这与C不同 .

  • 2

    你这样打电话 set

    set(&vectors, sizes, indexhere, tmp, length);
    

    但第一个参数被声明为 int ** . 通过 &vector 传递一个指向 vector 的指针,即 int *** 类型的指针 . 这种不匹配将导致未定义的行为和可能的崩溃 .

  • 1

    这是一个完整的工作示例 .

    #include <stdio.h>
    #include <stdlib.h>
    
    void destroyVectors(int **vectors, int size)
    {
    for (int i = 0; i < size; i++)
    {
        free(vectors[i]);
    }
    }
    
    int init(int*** vectors, int** sizes, int size)
    {
    int i, j;
    *sizes = (int*)malloc(size * sizeof(int));
    if (*sizes == NULL)
        return 0;
    for (j = 0; j < size; j++)
    {
        (*sizes)[j] = 0;
    }
    
    *vectors = (int**)malloc(size * sizeof(int*));
    if (*vectors == NULL)
        return 0;
    for (i = 0; i < size; i++)
    {
        (*vectors)[i] = NULL;
    }
    return 1;
    }
    int set(int **vectors, int *sizes, int index, int *tmp, int tmp_size)
    {
    if ((vectors)[index] != NULL)
    {
        free((vectors)[index]);
    }
    (vectors)[index] = (int*)malloc(tmp_size * sizeof(int));
    if ((vectors)[index] == NULL)
        return 0;
    for (int b = 0; b < tmp_size; b++)
    {
        (vectors)[index][b] = tmp[b];
    }
    sizes[index] = tmp_size;
    return 1;
    }
    
    int main()
    {
    int size = 0, length = 0, indexhere = 0;
    int** vectors = NULL;
    int* sizes = NULL;
    int* tmp = NULL;
    
    printf("\nPlease enter an amount of vectors:\n");
    scanf("%d", &size);
    init(&vectors, &sizes, size);
    
    printf("Enter index\n");
    scanf("%d", &indexhere);
    
    printf("Enter Length\n");
    scanf("%d", &length);
    
    tmp = (int*)malloc(length * sizeof(int));
    printf("Enter elements:\n");
    for (int g = 0; g < length; g++)
        scanf("%d", &tmp[g]);
    
    set(vectors, sizes, indexhere, tmp, length);
    
    for(int i = 0; i < length; ++i)
        printf("byte: %d\n", vectors[indexhere][i]);
    
    printf("sizes index: %d\n", sizes[indexhere]);
    
    free(tmp);
    free(sizes);
    destroyVectors(vectors, size);
    
    return 0;
    }
    

相关问题