[英]Can't access the memory location in an array without printing the contents of the array
我是 C 的新手,因此我不太擅长指针或处理内存位置的概念。 我的目标是在 C 中创建一个函数来切片数组,给定数组本身以及开始和结束索引。 我知道我的实现的替代方案,但我不知道为什么我的代码不起作用。
#include <stdio.h>
int* slice(int arr[], int first, int last) {
int new_arr[last - first];
int* p;
p = new_arr;
int i;
int j;
i = first;
j = 0;
while (i < last) {
new_arr[j] = arr[i];
// printf("From slice: %d\n", arr[i]);
i++, j++;
}
return p;
}
下面是我用来调用 slice 然后打印出新数组内容的函数。
int main() {
int test_arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int first_index = 0;
int last_index = 4;
int* x = slice(test_arr, first_index, last_index);
size_array = last_index - first_index;
for (int i = 0; i < size_array; i++) {
printf("From main: %d\n", *(i + x));
}
return 0;
}
我的代码的问题在于,当我取消对slice函数中的 print 语句的注释时,我得到x指向的数组包含值1、2 和 3 ,但是当我对其进行注释时,该函数不起作用。 据我所知,打印语句不应该影响结果。
切片中带有打印语句的输出:
From slice: 1
From slice: 2
From slice: 3
From main: 1
From main: 2
From main: 3
slice 中没有打印语句的输出:
From main: 1
From main: 0
From main: 0
返回指向非静态局部数组的指针是一个坏主意,因为它们在从函数返回时无效,因此返回的指针是无用的。
如果要返回对原始数组的引用,可以返回指向原始数组的指针:
int* slice(int arr[], int first, int last) {
return arr + first;
}
如果要返回数组的副本,可以动态分配内存:
#include <stdlib.h>
int* slice(int arr[], int first, int last) {
int i;
int* new_arr = malloc(sizeof(*new_arr) * (last - first));
if (new_arr == NULL) return NULL;
for (i = 0; first + i < last; i++) {
new_arr[i] = arr[first + i];
}
return new_arr;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.