我正在尝试将4个数组存储在一个数组中,由于某种原因,最后一个值会覆盖前三个值。例如,如果123; 456; 789; 987
被输入到下面的代码中,ipadr[0] - ipadr[4]
将仅存储123
。我已经过测试以确保numConvert()
正常工作,并且在numConvert
内,会返回4个不同的ints
数组,但只有numConvert(d)
是ipadr
数组(存储4次)。
另外,我的语法/代码是否正确,以便此函数将ipadr
作为数组(int**
)返回?为什么在初始化数组时需要使它static int*
?
我是C的新手,这让我非常沮丧。任何帮助都会非常感激。提前谢谢!!
int** ipConvert(int a, int b, int c, int d){
static int* ipadr[4];
ipadr[0]=numConvert(a);
ipadr[1]=numConvert(b);
ipadr[2]=numConvert(c);
ipadr[3]=numConvert(d);
return ipadr;
}
numConvert代码:
int* numConvert(int dec) {
static int hold[8];
...
return hold;
}
答案 0 :(得分:2)
更好地使用malloc进行动态分配,并使该函数分配8个整数。
int* numConvert(int dec) {
int *hold = (int *)malloc(sizeof(int) * 8); // C++ need cast!
int x = dec;
for(int y=7;y>=0;y--){
if(x%2==0 || x==0){
hold[y]=0;
}
else{
hold[y]=1;
}
x=x/2;
}
printf("\ntest loop: ");
for(int i=0;i<8;i++){
printf("%i", hold[i]);
}
printf("\n");
return hold;
}
然后,在您不再需要它们之后,必须释放返回的值。
至于 static ,this answer详细解释了它。
答案 1 :(得分:1)
每当你在hold
中写一些东西然后返回它时,你基本上会覆盖以前的值。有hold
的单个实例不是你可能想到的多个。
static
关键字。它与自动存储持续时间不同。
int* numConvert(int dec) {
int *hold = malloc(sizeof *hold *8);
if( hold == NULL){
fprintf(stderr,"Error in malloc");
exit(1);
}
int x = dec;
....
....
return hold;
}
使用完毕后释放动态分配的内存。
动态分配的内存的生命周期超出了函数的范围。就像它保持活跃的static
一样。但每次分配新的内存块时,与static
变量相反。为此,我们不会覆盖任何内容,这是您案件中的主要问题。
hold
具有自动存储持续时间,这意味着每次退出函数时hold
都会被释放,然后当我们调用它时,我们会得到一个名为hold
的局部变量。所以在每个我们得到不同的实例。这就是我们返回hold
中包含的地址的原因。地址保持包含的存储器具有超出功能范围的寿命。因此它与本地变量hold
不同,我们将此地址存储在其他函数中。
答案 2 :(得分:0)
将hold变量声明为实例变量,而不是静态变量,如
int* numConvert(int dec) {
int hold[8];