繁体   English   中英

在不打印数组内容的情况下无法访问数组中的内存位置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM