使用 c 编写动态数组时,不同版本的 gcc 的输出不同
different output with different version of gcc, when code dynamic array using c
我正在用c语言编写一个关于动态数组的程序,代码是:
#include <stdio.h>
struct Vector {
int size;
int capacity;
int *arr;
};
void add(struct Vector *Arr, int data) {
if (Arr->size == Arr->capacity) {
Arr->capacity *= 2;
int arr[Arr->capacity];
//array copy
for (int i = 0; i < Arr->size; i++) {
arr[i] = Arr->arr[i];
}
Arr->arr = arr;
}
int size = Arr->size;
Arr->arr[size] = data;
Arr->size++;
}
void display(struct Vector *Arr) {
for (int i = 0; i < Arr->size; i++) {
printf("%d ", Arr->arr[i]);
}
printf("\n");
}
int main() {
int arr[10];
struct Vector
array = {0, 10, arr};
//fill the array
for (int i = 0; i < 10; i++) {
add(&array, i);
}
display(&array);
//more element than the init size
add(&array, 10);
display(&array); //where the error happened
return 0;
}
当数组增长时,它有如下不同的输出:
将 dev-cpp 与 gcc 4.9 结合使用:
在 gcc8.2 中使用 vs 代码
最后一个是我的期望
问题是你有未定义的行为,所以任何事情都可能发生。它可以在不同的机器或编译器上以不同的方式表现出来。考虑一下:
if (Arr->size == Arr->capacity) {
Arr->capacity *= 2;
int arr[Arr->capacity];
...
Arr->arr = arr; // Arr->arr points to a local variable!
这里您正在创建一个新数组,然后将其地址分配给向量。但是,当该功能完成时,该内存将变为无效。相反,将其替换为:
int *arr = malloc(sizeof(int) * Arr->capacity);
你得到以下输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10
完成后不要忘记 free
。为了让它正常工作,我建议将 int arr[10];
更改为 int arr = malloc(10*sizeof(int));
这样数组就永远不会在堆栈上,然后在 Arr->arr = arr;
之前放置一个 free(Arr->arr);
以及a free(array.arr);
在程序的末尾。
我正在用c语言编写一个关于动态数组的程序,代码是:
#include <stdio.h>
struct Vector {
int size;
int capacity;
int *arr;
};
void add(struct Vector *Arr, int data) {
if (Arr->size == Arr->capacity) {
Arr->capacity *= 2;
int arr[Arr->capacity];
//array copy
for (int i = 0; i < Arr->size; i++) {
arr[i] = Arr->arr[i];
}
Arr->arr = arr;
}
int size = Arr->size;
Arr->arr[size] = data;
Arr->size++;
}
void display(struct Vector *Arr) {
for (int i = 0; i < Arr->size; i++) {
printf("%d ", Arr->arr[i]);
}
printf("\n");
}
int main() {
int arr[10];
struct Vector
array = {0, 10, arr};
//fill the array
for (int i = 0; i < 10; i++) {
add(&array, i);
}
display(&array);
//more element than the init size
add(&array, 10);
display(&array); //where the error happened
return 0;
}
当数组增长时,它有如下不同的输出:
将 dev-cpp 与 gcc 4.9 结合使用:
在 gcc8.2 中使用 vs 代码
最后一个是我的期望
问题是你有未定义的行为,所以任何事情都可能发生。它可以在不同的机器或编译器上以不同的方式表现出来。考虑一下:
if (Arr->size == Arr->capacity) {
Arr->capacity *= 2;
int arr[Arr->capacity];
...
Arr->arr = arr; // Arr->arr points to a local variable!
这里您正在创建一个新数组,然后将其地址分配给向量。但是,当该功能完成时,该内存将变为无效。相反,将其替换为:
int *arr = malloc(sizeof(int) * Arr->capacity);
你得到以下输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10
完成后不要忘记 free
。为了让它正常工作,我建议将 int arr[10];
更改为 int arr = malloc(10*sizeof(int));
这样数组就永远不会在堆栈上,然后在 Arr->arr = arr;
之前放置一个 free(Arr->arr);
以及a free(array.arr);
在程序的末尾。