在 C++ 中分配内存后,for 语句中的索引更改值

问题描述

我正在尝试解决来自 HackerRank 的一个编程问题。编程挑战是关于具有动态内存的可变大小数组。我遇到了内存分配的奇怪问题。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned int u_int;

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    u_int n=0,q=0;
    scanf("%d%d",&n,&q);
    if(n<0 || n>pow(10,5) || q < 0 || q>pow(10,5)){
        return 0;
    }
    printf("entered %d & %d\n\r",n,q);
    int *ptr = new int[n];
    int** arr = &ptr;
    
    for (size_t i = 0; i < n; i++) {
        u_int size = 0;
        scanf("%d",&size);
        printf("1 entered size %d & i=%d\n\r",size,i);
        if(size<0 || size>(3*pow(10,3))){
            return 0;
        }
        printf("2 entered size %d & i=%d\n\r",i);
        arr[i] = new int[size];
        printf("3 entered size %d & i=%d\n\r",i);
        for(size_t j=0; j< size;j++){
            printf("4 entered size %d & i=%d & j=%d\n\r",i,j);
            int val = 0;
            scanf("%d",&val);
            printf("5 entered size %d & i=%d & j=%d & entered Val=%d\n\r",j,val);
            arr[i][j] = val;
        }
    }
    
    int* output = new int[q];
    
    for (size_t i=0; i< q;i++){
        unsigned int a=0,b=0;
        cin >>a >>b;
        output[i] = arr[a][b];
    }
    
    for(size_t i=0; i< q;i++){
        cout <<output[i]<<endl;
    }
    
    return 0;
}

这个程序的输出是:

2 2
entered 2 & 2
3 1 2 3
1 entered size 3 & i=0
2 entered size 3 & i=0
3 entered size 3 & i=0
4 entered size 3 & i=0 & j=0
5 entered size 3 & i=0 & j=0 & entered Val=1
4 entered size 3 & i=0 & j=1
5 entered size 3 & i=0 & j=1 & entered Val=2
4 entered size 3 & i=0 & j=2
5 entered size 3 & i=0 & j=2 & entered Val=3
5 1 2 3 4 5
1 entered size 5 & i=1
2 entered size 5 & i=1
3 entered size 5 & i=1433835216
4 entered size 5 & i=1433835216 & j=0
5 entered size 5 & i=1433835216 & j=0 & entered Val=1

问题在于 printf 中“i”的值。

    2 entered size 5 & i=1
3 entered size 5 & i=1433835216
4 entered size 5 & i=1433835216 & j=0

程序中“i”的值在以下位置发生了变化。有人能解释一下为什么“i”的值在内存分配后发生了变化?

printf("2 entered size %d & i=%d\n\r",i);
arr[i] = new int[size];
printf("3 entered size %d & i=%d\n\r",i);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)