代码之家  ›  专栏  ›  技术社区  ›  Ultraviolence

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

  •  0
  • Ultraviolence  · 技术社区  · 6 年前

    我是C新手,一直在尝试解决这个问题。这是 the last thread I made .我取得了一些进步,但仍有很多东西需要学习和修复。

    简而言之:

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

    我需要使用这些变量:

    • int**向量-2D数组
    • int size-表示**向量中存在多少向量的整数
    • int*size—表示向量长度的一维整数数组

    我需要编写以下函数:

    • int init(int***向量,int**大小,int大小)
      该函数将内存分配给**向量和*大小为size的向量,并将向量初始化为充满null,将大小初始化为充满零。

    • int set(int**向量,int*大小,int索引,int*tmp,int tmp\u大小)
      该函数接收一个空数组(**向量)),释放**向量中的向量,该向量的索引为index,并为新向量分配内存,该向量的长度为tmp\u 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 回复  |  直到 6 年前
        1
  •  2
  •   r3mus n0x    6 年前
    1. 在里面 init 作用 (vectors)[i] = NULL; 实际上应该是 (*vectors)[i] = NULL;
    2. 呼叫时 set 功能来自 main 你应该通过 vectors 而不是 &vectors

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

        2
  •  1
  •   Some programmer dude    6 年前

    你打电话 set 像这样

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

    但是第一个参数被声明为 int ** .通过 &vector 您正在将指针传递给 vector ,即某种类型的 int *** 。此不匹配将导致 未定义的行为 以及可能的车祸。

        3
  •  1
  •   малин чекуров    6 年前

    下面是一个完整的工作示例。

    #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;
    }