动态分配数组,更改并显示它存储的值

时间:2015-12-06 15:09:10

标签: c arrays char

我正在尝试构建一个支持某些功能的rudimendary内存分配器:

  • INITIALIZE(创建一个包含N个元素的char数组),FINALIZE(释放为数组分配的内存)
  • DUMP(显示当时存储在数组中的所有值)
  • ALLOC(为用户分配一定数量的char元素,以便他可以在其中存储一些值)

我遇到了DUMP和ALLOC函数的问题:DUMP不会打印存储在数组中的值(它会打印出一些垃圾值),而我无法找到如何修改存储在数组中的值(需要用于ALLOC)。

下面我发布了我的函数的源代码:

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

void initialize(int N, char **v)
{
    int i;
    *v = (char*)malloc(N * sizeof(char));
    printf("Initialized array with %d char elements \n", N);
    for(i = 0; i < N; i++)
    {
        v[i] = 0;
        printf("%hhd ", v[i]);
    }
}

void finalize(char *v)
{
    printf("Memory of the array has been freed \n");
    free(*v);
}

void dump(char **v, int N)
{
    int i;
    printf("Memory map:\n");
    for(i = 0; i < N; i++)
    {
        printf("%hhd ", v[i]);
    }
}

在我的主要功能中,我有char *vint N并且用于调用函数: initialize(N, &v)finalize(&v)dump(&v,N)N是数组要存储的元素数。

1 个答案:

答案 0 :(得分:2)

由于您要打印存储的元素,您只需要将指针传递给指针即可。只需传递指针:

char *v;
...
...
finalize(v);

并修改dump()

void dump(char *v, int N)
{
    int i;
    printf("Memory map:\n");
    for(i = 0; i < N; i++)
    {
        printf("%c ", v[i]);
    }
}

同样,您也不需要指向finalize()指针的指针。如果要修改指针,通常需要将指针传递给指针(就像在initialize()中一样)。

initialize()也有问题。这个v[i]访问错误,因为你想要修改指针,而不是指针本身。

您可以修改它:

void initialize(int N, char **v)
{
    int i;
    char *t = malloc(N * sizeof(char));

    if (t == NULL) {/* error*/ }

    printf("Initialized array with %d char elements \n", N);
    for(i = 0; i < N; i++)
    {
        t[i] = 0;
        printf("%hhd ", t[i]);
    }
    *v = t;
}