【发布时间】:2018-02-14 16:06:16
【问题描述】:
我用 Visual Studio 9.0 (2008) 编译了一些代码。
行为符合预期,但是当我分配一些手工制作的二维数组时 函数,Visual-Studio 会生成一些 C4133 警告:
void ** alloc_2d(int w, int h, size_t type_size);
void free_d2(void ** mem);
int main (void)
{
float ** data;
/* Here is generated a C4133 warning:
"incompatible type from void ** to float **" */
data = alloc_2d(100, 100, sizeof **data);
/* do things with data */
/* free data */
free_2d(data);
return 0;
}
我明白为什么会产生这个警告,但我想知道我应该怎么做才能让它安静。
我该怎么办?
- 接受警告?
- 禁用警告(我认为很危险)?
- 禁用围绕
alloc_2d调用的警告(使用一些特定于 视觉工作室)? - 强制转换函数返回(但 [Do I cast the result of malloc?)
第二个问题:
- 较新的/其他编译器是否知道这种类型的转换?
void** 后面隐藏着两个数组:一个大用于存储我需要连续的所有数据,另一个用于浏览不同的行。
实现看起来像(我删除了错误检查)
void **alloc_2D_array(int w, int h, size_t size)
{
void ** mem = malloc(w * sizeof *mem);
*mem = malloc(w*h*size);
for (i = 1; i < w; ++i)
{
mem[i] = (void*)((char*)mem[0] + i*w*size);
}
return mem;
}
【问题讨论】:
-
malloc返回一个void *,它是一个通用指针。但是你的函数返回一个void **,它不是一个通用指针,所以你必须强制转换它。 -
为什么要用指针的指针?您可以使用指针和简单的数学计算来分配二维数组!你是如何编写 alloc_2d 函数的? (发布它可能会解决您的问题)。
-
我认为如果不是严格有用的指针,最好避免使用指针。
标签: c visual-studio-2008 casting