所以下面的代碼編譯時沒有gcc的警告等,但由於某種原因,交換代碼實際上並沒有通過交換值來修改數組......這裏可能會發生什麼?一個有趣的事情是,temp
總是包含我想要的,它只是不被使用。C - 結構數組元素交換
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//STRUCTURES
struct complex_
{
double re, im;
};
typedef struct complex_ complex;
//PROTOTYPES
int reverseBits(int x,int elements);
complex new_complex(double re, double im);
//MAIN
int main()
{
int n,m,elements = 8;
complex temp,**v;
//Allocate memory for the struct array...
v = malloc(sizeof(complex*));
*v = malloc(sizeof(complex)*elements);
//Initialize the struct array...
for (n = 0; n < elements; n++)
{
(*v)[n] = new_complex(n,0);
}
//View the initialized struct array contents...
for (n = 0; n < elements; n++){printf("%f+%fi\n", (*v)[n].re,(*v)[n].im);}
//Swap elements for the bit reversal...
for (n = 0; n < elements; n++)
{
m = reverseBits(n,elements);
temp = (*v)[n];
(*v)[n] = (*v)[m];
(*v)[m] = temp;
}
//View the new swapped struct array contents...
for (n = 0; n < elements; n++){printf("%f+%fi\n", (*v)[n].re,(*v)[n].im);}
return 0;
}
//FUNCTION DEFINITIONS
int reverseBits(int x,int elements)
{
//This function performs a binary bit reversal
//for example 3 = 011 => 110 = 6...
int num_bits = log2(elements);
int reverse_x = 0;
int i;
for (i = 0; i < num_bits; i++)
{
if((x & (1 << i)))
reverse_x |= 1 << ((num_bits - 1) - i);
}
return reverse_x;
}
complex new_complex(double re, double im)
{
//This function creates a new complex number.
complex r;
r.re = re;
r.im = im;
return r;
}
您沒有執行分配權限。你現在先分配一個指向'complex *'的指針,然後分配一個第一個指針指向的'complex'數組。你最好分配一個'complex *'指針數組,'malloc(sizeof(complex *)* elements)',並用'new_complex'填充它。另外,你應該釋放所有分配的內存 - 首先是複合體,然後是數組。 – eran
我創建一個指向數組的指針的原因是我將在其他函數中修改該數組。這仍然是一個問題嗎?另外,我同意 - 我應該釋放內存。 –
你仍然可以按照我建議你創建它的方式傳遞數組。如果你想要其他函數來創建數組或者用另一個函數替換它,你可以通過'&v'來實現,並且在那裏執行'* v = some_other_complex_star_star'。但是如果你想改變數組的內容,你可以按原樣傳遞 - 'v'。 – eran