【发布时间】:2017-08-18 03:12:07
【问题描述】:
假设我有以下代码(示例):
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void Ex(void *ret, int ret_len, int choice){
if(choice==1){
int *ret = ret;
for(int i=0; i<ret_len; i++){
*(ret+i) = i;
}
} else {
int **ret = ret;
for(int i=0; i<ret_len; i++){
for(int j=0; j<ret_len; j++){
*(*(ret+i)+j) = i*j;
}
}
}
}
int main()
{
int m[10];
Ex(m,10,1);
printf("%i",m[3]);
return 0;
}
该函数的目标是获取一个指向一维数组的预分配内存的指针。或。
当编译和执行代码在choice==1时工作,否则,如果我运行
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void Ex(void *ret, int ret_len, int choice){
if(choice==1){
int *ret = ret;
for(int i=0; i<ret_len; i++){
*(ret+i) = i;
}
} else {
int **ret = ret;
for(int i=0; i<ret_len; i++){
for(int j=0; j<ret_len; j++){
*(*(ret+i)+j) = i*j;
}
}
}
}
int main()
{
int m[100];
Ex(m,10,2);
printf("%i", m[3][5]);
return 0;
}
没有产生任何输出,代码似乎永远运行(注意选择现在不是 1,m 是正确的大小)
我的印象是 Ex 中的强制转换应该改变数组的形状并允许 main 像 2d 一样索引它,但既不能像 1d 那样索引也不能像 2d 一样工作。
【问题讨论】:
-
*(ret+i)的类型是int,所以*(int_value+j)不能取消引用。 -
是的,这行
*(*(ret+i)+j)=i*j;没有意义。 -
ret[i][j]和*(*(ret+i)+j)之间的唯一区别是一个比另一个更短、更容易阅读、更难出错 - ifret的参数类型是int **ret(或int *ret[20]的一些变体)。将ret定义为int *ret,任何双重取消引用都是错误的。请注意,int **ret和int *ret[20]类型非常不同,尽管您可以同时使用ret[i][j]。 -
@BLUEPIXY 说得有道理,但是如何以传统方式完成呢?
-
根据您使用
malloc保护的方式,我认为有必要将一维数组计算为二维数组,这与您的解释相反。
标签: c arrays pointers compiler-errors