C中的错误指针?

时间:2013-12-19 07:36:49

标签: c pointers function-pointers

我有五个向量,我在这个函数中改变它们的值

标题:

char *lfsr(char *bin);    
char *saveToArray(FILE *hexFile);
char *hexToBinary(char *hex);

我改变了他们的价值观:

FILE *hexFile = fopen("hex.txt", "rb"); //recebido pela consola
char *seed;
char *x0, *y0, *z0, *dT0;

seed = saveToArray(hexFile);

x0 = hexToBinary(seed);

y0 = lfsr(x0);

z0 = lfsr(y0);

dT0 = lfsr(z0);

这是lfsr函数:

char* lfsr(char *bin)
{
    //bits significativos para fazer o xor 128 -> 128,126,101,99;
    int bits[4];
    int bit;

    if(bin[0] == '0')
        bits[0] = 0;
    else if(bin[0] == '1')
        bits[0] = 1;

    if(bin[2] == '0')
        bits[1] = 0;
    else if(bin[2] == '1')
        bits[1] = 1;

    if(bin[21] == '0')
        bits[2] = 0;
    else if(bin[21] == '1')
        bits[2] = 1;

    if(bin[19] == '0')
        bits[3] = 0;
    else if(bin[19] == '1')
        bits[3] = 1;

    bit = bits[0] ^ bits[1] ^ bits[2] ^ bits[3] ^ 1;
    //reconstruir o vector de char depois do lfsr
    for(int i = 127; i >= 1; i--)
    {
        bin[i] = bin[i - 1];
    }

    bin[0] = (char)(48 + bit);  

    return bin;
}

问题是,x0y0z0的值最终会与dT0相同。

我该怎么做才能避免这种情况?

2 个答案:

答案 0 :(得分:1)

您从bin函数返回参数lfsr。这个指针总是一样的。所以你真正做的是让所有变量指向同一个位置。

所以当你这样做时

y0 = lfsr(x0);

您将y0指向x0已指向的内容。当你做的时候

z0 = lfsr(y0);

你让z0指向y0指向的内容,因为它已经指向x0所指向的内容,这与制作z0点相同同样如此。

如果您打印出指针,您会看到它们都具有完全相同的值。


解决此问题的一种简单方法是将所有变量(x0y0等)数组生成,然后将它们作为参数传递。

答案 1 :(得分:0)

* x0,* y0,* z0,* dT0

的第一个malloc内存

然后使用临时指针返回函数。

char *pTmp

pTmp= hexToBinary(seed);

然后将pTmp的内容相应地memcpy到x0,y0,z0,dT0。

memcpy(x0,pTmp,size);

你应该找到一些方法来弄清楚文件的大小。