将动态分配数组的指针传递给 C++ 中的函数

问题描述 投票:0回答:4

我遇到了变量在内存中相互覆盖的问题,所以我决定尝试动态分配我的数组之一。

在下面的简化代码中,我“尝试”使用动态分配创建一个整数数组,然后使用一个函数编辑该整数数组中的值。一旦函数执行完毕,我希望有一个经过良好处理的数组以供其他函数使用。 据我所知,数组不能传递给函数,所以我只是将指向数组的指针传递给函数。

#include <iostream> using namespace std; void func(int *[]); int main(){ //dynamically allocate an array int *anArray[100]; anArray[100] = new int [100]; func(anArray); int i; for (i=0; i < 99; i++) cout << "element " << i << " is: " << anArray[i] << endl; delete [] anArray; } void func(int *array[]){ //fill with 0-99 int i; for (i=0; i < 99; i++){ (*array)[i] = i; cout << "element " << i << " is: " << array[i] << endl; } }

当我尝试编译上面的代码时,g++ 给出以下警告:

dynamicArray.cc: In function ‘int main()’: dynamicArray.cc:21:12: warning: deleting array ‘int* anArray [100]’ [enabled by default]

当我运行编译后的 a.out 可执行文件时,它什么也不输出,除了消息之外什么也没有留下 

Segmentation fault (core dumped)

在终端。

我做错了什么?我的代码没有尝试访问或写入我创建的数组之外的任何内容。事实上,我什至没有尝试读取或写入数组的最后一个元素!

当我注释掉实际修改数组的部分时,会发生一些非常奇怪的事情,就像这样

//(*array)[i] = i;

G++ 编译时带有相同的警告,但是当我执行 a.out 时,我得到了这个:

element 0 is: 0x600df0 element 1 is: 0x400a3d element 2 is: 0x7f5b00000001 element 3 is: 0x10000ffff element 4 is: 0x7fffa591e320 element 5 is: 0x400a52 element 6 is: 0x1 element 7 is: 0x400abd element 8 is: 0x7fffa591e448 element 0 is: 0x600df0 element 1 is: 0x400a3d element 2 is: 0x7f5b00000001 element 3 is: 0x10000ffff element 4 is: 0x7fffa591e320 element 5 is: 0x400a52 element 6 is: 0x1 element 7 is: 0x400abd element 8 is: 0x7fffa591e448 *** glibc detected *** ./a.out: munmap_chunk(): invalid pointer: 0x00007fffa591e2f0 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f5b92ff4b96] ./a.out[0x400976] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f5b92f9776d] ./a.out[0x400829] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 00:13 4070334 /home/solderblob/Documents/2013 Spring Semester/CSC 1254s2 C++ II/Assignment 1/a.out 00600000-00601000 r--p 00000000 00:13 4070334 /home/solderblob/Documents/2013 Spring Semester/CSC 1254s2 C++ II/Assignment 1/a.out 00601000-00602000 rw-p 00001000 00:13 4070334 /home/solderblob/Documents/2013 Spring Semester/CSC 1254s2 C++ II/Assignment 1/a.out 01eb5000-01ed6000 rw-p 00000000 00:00 0 [heap] 7f5b92a64000-7f5b92a79000 r-xp 00000000 08:16 11276088 /lib/x86_64- linux-gnu/libgcc_s.so.1 7f5b92a79000-7f5b92c78000 ---p 00015000 08:16 11276088 /lib/x86_64- linux-gnu/libgcc_s.so.1 7f5b92c78000-7f5b92c79000 r--p 00014000 08:16 11276088 /lib/x86_64- linux-gnu/libgcc_s.so.1 7f5b92c79000-7f5b92c7a000 rw-p 00015000 08:16 11276088 /lib/x86_64-linux-gnu/libgcc_s.so.1 7f5b92c7a000-7f5b92d75000 r-xp 00000000 08:16 11276283 /lib/x86_64-linux-gnu/libm-2.15.so 7f5b92d75000-7f5b92f74000 ---p 000fb000 08:16 11276283 /lib/x86_64-linux-gnu/libm-2.15.so 7f5b92f74000-7f5b92f75000 r--p 000fa000 08:16 11276283 /lib/x86_64-linux-gnu/libm-2.15.so 7f5b92f75000-7f5b92f76000 rw-p 000fb000 08:16 11276283 /lib/x86_64-linux-gnu/libm-2.15.so 7f5b92f76000-7f5b9312b000 r-xp 00000000 08:16 11276275 /lib/x86_64-linux-gnu/libc-2.15.so 7f5b9312b000-7f5b9332a000 ---p 001b5000 08:16 11276275 /lib/x86_64-linux-gnu/libc-2.15.so 7f5b9332a000-7f5b9332e000 r--p 001b4000 08:16 11276275 /lib/x86_64-linux-gnu/libc-2.15.so 7f5b9332e000-7f5b93330000 rw-p 001b8000 08:16 11276275 /lib/x86_64-linux-gnu/libc-2.15.so 7f5b93330000-7f5b93335000 rw-p 00000000 00:00 0 7f5b93335000-7f5b93417000 r-xp 00000000 08:16 31987823 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16 7f5b93417000-7f5b93616000 ---p 000e2000 08:16 31987823 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16 7f5b93616000-7f5b9361e000 r--p 000e1000 08:16 31987823 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16 7f5b9361e000-7f5b93620000 rw-p 000e9000 08:16 31987823 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16 7f5b93620000-7f5b93635000 rw-p 00000000 00:00 0 7f5b93635000-7f5b93657000 r-xp 00000000 08:16 11276289 /lib/x86_64-linux-gnu/ld-2.15.so 7f5b93834000-7f5b93839000 rw-p 00000000 00:00 0 7f5b93853000-7f5b93857000 rw-p 00000000 00:00 0 7f5b93857000-7f5b93858000 r--p 00022000 08:16 11276289 /lib/x86_64-linux-gnu/ld-2.15.so 7f5b93858000-7f5b9385a000 rw-p 00023000 08:16 11276289 /lib/x86_64-linux-gnu/ld-2.15.so 7fffa5900000-7fffa5921000 rw-p 00000000 00:00 0 [stack] 7fffa59ff000-7fffa5a00000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] Aborted (core dumped)


c++ pointers segmentation-fault dynamic-memory-allocation
4个回答
5
投票

int *anArray[100]; anArray[100] = new int [100];

在第一行中,您分配了一个包含 100 个 int 指针的数组。
在第二行中,动态分配一个 int 数组,并将该数组的地址分配给指针数组的第 100 个单元格。正确的语法是:

int *anArray; anArray = new int [100];



1
投票
0

开始。

len 
100
数组的索引从
0
99

所以

anArray[100]

给你

分段错误
也许你想这样做:

anArray[99] = new int[100];


OR

如果您只想动态分配一个指向int的指针数组,请执行以下操作: int **anArray = new int*[100];

    


0
投票
anArray

是一个包含 100 个 int 指针的数组。对于第 101 个元素(缓冲区溢出!),您分配一个指针,该指针指向动态分配的 100 个整数数组的第一个元素。您想要修复该问题并将这两行合并为

int* anArray = new int[100];
    


0
投票
首先,您分配一个包含 100 个指针的数组。
那么您正在执行超出范围的访问。 
anArray

的最后一个元素是

anArray[99]
,但您正在将内存分配给不存在的
anArray[100]
。这将导致分段错误。

最后,您将删除一个类型为

int*

的静态数组。

anArray
在编译时分配,包含100个
int
类型的指针。删除
delete[]
语句。
    

© www.soinside.com 2019 - 2024. All rights reserved.