微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。