循环外的变量值重置

Variable value resetting outside of loop

提问人:Alphatality 提问时间:6/11/2023 更新时间:6/13/2023 访问量:39

问:

我遇到了一个我不明白的记忆问题(可能只是我傻了)。 我在 cw() 中初始化了一个指向 int 的指针。我把它交给cw_saving,在那里我把它递增,这里是 42。循环中一切顺利,但是当我出去时,k 设置为 7。我只是不明白。这是印刷品

typedef struct {
    float saving;
    int debut;
    int fin;
} Savings;

void cw_savings(float** matrice, int n, int n_hangar, Savings* savings,int * k) {
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < n; j++) {
            if (i == j) {
                continue;
            } else {
                savings[(*k)].saving = matrice[i][n_hangar] + matrice[n_hangar][j] - matrice[i][j];
                savings[(*k)].debut = i;
                savings[(*k)].fin = j;
                printf("k=%d , adresse = %p\n",(*k),k);
                (*k)= (*k)+1;
            }
        }
    }
    printf("k final=%d, adresse = %p\n",(*k),k);
    //QuickSort(savings, 0, n - 2);
    qsort(savings,(*k),sizeof(Savings),comp);
}

int** cw(float** matrice, int n,int n_hangar, int vehicule_capacity,int* poids){
    Savings* saving = calloc(((n - 1) * (n - 1) - n-1),sizeof(Savings));
    int* k = calloc(1,sizeof(int));
    (*k) = 0;
    cw_savings(matrice, n, n_hangar, saving,k);
    int** res = initialisation(n-1);
    cw_merge(res, saving ,vehicule_capacity,poids, n-1,(*k));
    free(saving);
    return res;
}

int main() {
    int n = 8; 
    int n_hangar = 0; 
    int vehicule_capacity = 30;
    int poids[] = {6,8,3,9,1,3,5};
    float** matrice = calloc((n), sizeof(float*));  

    for (int i = 0; i < n; i++) {
        matrice[i] = (float*)calloc(n,sizeof(float));
    }
    // Initialiser et remplir la matrice avec des valeurs factices
    float t1 []= {0, 214.1, 378.2, 361.7, 231.7, 523.4, 308.8, 299.7};
    float t2 []= {163.2, 0, 164.1, 311.5, 284.1, 393.8, 309.1, 203.6};
    float t3 []= {321.1, 157.9, 0, 371.5, 344.1, 539.5, 369.1, 263.6};
    float t4 []= {344.1, 303., 311.5, 0, 215.7, 595.6, 133.2, 121.1};
    float t5 []= {222.1, 268.8, 277.3, 221.7, 0, 595, 168.8, 159.7};
    float t6 []= {497.2, 421.8, 518.2, 642.51, 638.2, 0, 663.2, 581.3};
    float t7 []= {299.5, 296.1, 304.6, 160.1, 171.1, 622.3, 0, 119.6};
    float t8 []= {286.6, 187.4, 195.9, 120.1, 160.5, 513.6, 121.0, 0};

    for (int i =0; i<n;i++){
        matrice[0][i] = t1[i];
        matrice[1][i] = t2[i];
        matrice[2][i] = t3[i];
        matrice[3][i] = t4[i];
        matrice[4][i] = t5[i];
        matrice[5][i] = t6[i];
        matrice[6][i] = t7[i];
        matrice[7][i] = t8[i];
    }

    int** resultat = cw(matrice,n,n_hangar,vehicule_capacity,poids);

    for (int i = 0; i < n; i++) {
        free(matrice[i]);
    }
    free(matrice);
    printf("[");
    for (int i =0; i<n-1;i++){
        printf("%d",resultat[0][i]);
    }
    printf("]");
    printf("[");
    for (int i =0;i<n-1;i++){
        if (resultat[0][i] == 0){
            continue;
        }
        printf("[");
        for (int j = 0;j<resultat[0][i]+2;j++){
            printf("%d,",resultat[i+1][j]);
        }
        printf("]");
        free(resultat[i+1]);
    }
    printf("]");
    free(resultat[0]);
    free(resultat);

    return 0;
}

我尝试了一切,甚至更换了电脑并在线编译

C 内存 内存管理 malloc

评论

0赞 pmacfarlane 6/12/2023
你的编译器是否给你任何关于这一行的警告?cw_savings(matrice, n, n_hangar, saving,k);

答:

1赞 dimich 6/12/2023 #1

您分配了 40 个 elemets:saving

Savings* saving = calloc(((n - 1) * (n - 1) - n-1),sizeof(Savings));
(8 - 1) * (8 - 1) - 8-1) = 49 - 8 - 1 = 40

所以有效指标是 [0..39]。但是您使用超出范围的索引 40 进行访问。它会导致未定义的行为。savings[(*k)]

您可能希望在括号中:n-1

Savings* saving = calloc(((n - 1) * (n - 1) - (n-1)),sizeof(Savings));