我正在尝试构建一个支持某些功能的rudimendary内存分配器:
我遇到了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 *v
,int N
并且用于调用函数:
initialize(N, &v)
,
finalize(&v)
和
dump(&v,N)
。 N
是数组要存储的元素数。
答案 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;
}