在 C 中更新变量时不需要的数组更新

Unwanted array update when updating a variable in C

我正在尝试使用 sprintf 将 int 转换为 char。

    for(int i=0; i<n; i++){
       char buffer[100];
       load = group[i];

       int num = pow(10, (load-1));
       for(int j=(load-2); j>=0; j--){
           num+=pow(10, j);
       }
    
       sprintf(buffer,"%d",num);
       (...)

当我打印 buffer 时,一切似乎都很好,因为我只希望它是一个字符串。 然后,我想将它存储在一个数组中。具体在这里:

typedef struct Unario {
    char * bits ;
} Unario ;

但是当尝试将 buffer 存储在数组的下一个索引中时,之前保存的所有其余变量更新为新的 buffer 定义。

完整函数如下:

Unario * comprimir_en_unario ( int n, int * grupo ){
    int load;
    int j = 0;
    int SIZE = n*2;
    Unario * comprimiendo = malloc(SIZE * sizeof(comprimiendo));
    
    for(int i=0; i<n; i++){
        char buffer[100];
        load = grupo[i];
        printf("\ngrupo[%d] = %d\n", i, load);

        int num = pow(10, (load-1));
        for(int j=(load-2); j>=0; j--){
            num+=pow(10, j);
        }
        
        sprintf(buffer,"%d",num);
        comprimiendo[j].bits = buffer;
        j++;
        comprimiendo[j].bits = "0";
        j++;
    }
    
    for(int i=0; i<SIZE; i++){
        printf("in %d = %s\n", i, comprimiendo[i].bits);
    }
    return comprimiendo;
};

使用以下输入:

int m[6] = {8,2,8,8,2,3};

和以下不需要的输出:

in 0 = 111
in 1 = 0
in 2 = 111
in 3 = 0
in 4 = 111
in 5 = 0
in 6 = 111
in 7 = 0
in 8 = 111
in 9 = 0
in 10 = 111
in 11 = 0

以及我想要得到的那个:

in 0 = 11111111
in 1 = 0
in 2 = 11
in 3 = 0
in 4 = 11111111
in 5 = 0
in 6 = 11111111
in 7 = 0
in 8 = 11
in 9 = 0
in 10 = 111
in 11 = 0

旁注:我不能更改结构也不能删除它,因为它是一组结构的一部分。

因为你的结构中的位不能存储值,它只是一个指针

所以你必须确保每次你把你的搅拌器存放在某个地方

在你使用的函数中,每次使用sprintf时,buffer中存储的值都会被刷新

在这种情况下,您的最终输出必须是缓冲区的最新值

也就是说,如果把数组从{8,2,8,8,2,3}改成{8,2,8,8,2,4},最后输出的都是1111 (缓冲区的最新值)

这是一种保存方式,我用二维数组来存储字符串

Unario * comprimir_en_unario(int n, int * grupo) 
{
    int load;
    int j = 0;
    int SIZE = n * 2;
    Unario * comprimiendo = (Unario *)malloc(SIZE * sizeof(Unario));//No need to change.

    char buffer[100][100];//Use 2d array to store the string each time

    for (int i = 0; i < n; i++) 
    {
        load = grupo[i];
        printf("grupo[%d] = %d\n", i, load);
        int num = pow(10, (load - 1));

        for (int j = (load - 2); j >= 0; j--)
        {
            num += pow(10, j);
        }

        sprintf(&buffer[i][0], "%d", num);//Related changes
        comprimiendo[j].bits = &buffer[i][0];//Related changes
        j++;
        comprimiendo[j].bits = "0";
        j++;
    }

    for (int i = 0; i < SIZE; i++) 
    {
        printf("in %d = %s\n", i, comprimiendo[i].bits);
    }
    return comprimiendo;
}

在您注意到您的原始功能的问题后,您可能会找到更多解决方案