【问题标题】:Double pointers, dynamic allocation, and using pointer arrays双指针、动态分配和使用指针数组
【发布时间】:2016-10-04 23:19:18
【问题描述】:

所以我已将代码范围缩小到我需要帮助的范围内。抱歉之前的文字墙和乱七八糟的代码。

// Headers
#include <stdio.h>
#include <stdlib.h>

// Function Protype
void test_function(int **ptr2);

// Main Function
int main(void) {
    int *ptr1;
    int i = 0; // Counter

    test_function(&ptr1); // Calling function

    for (i = 0; i < 10; i++) {
        printf("%d", ptr[i]); // Should print numbers from 0-9
    }

    return 0;
}

// Custom Function
void test_function(int **ptr2) {
    // Variables
    int i = 0; // Counter
    int j = 0; // Dynamic allocator

    *ptr2 = malloc(sizeof(int) * j); // Allocates 10 slots of size int

    for (i = 0; i < 10; i++) {
        *ptr2[i] = i; // <----- This line gives a segmentation fault error
    }

    return;
}

所以基本上,这个程序应该使用 malloc 遍历一个数组以分配 j 的动态大小,输入数字 0-9 并将 0-9 显示给用户。然而,函数test_function 中被注释的行给了我一个分段错误错误。

【问题讨论】:

  • 使用调试器。至少它会告诉您哪行代码触发了段错误,这是您应该与我们分享的信息。另外,尽量让你的问题简洁:代码、它应该做什么以及它实际上在做什么。例如,为什么要显示两个版本的代码?我们应该从中得到什么,你真正要问的是哪一个?
  • 安装 GDB(GNU 调试器)它会花 10 分钟找出你的错误
  • 我们应该如何调试整个程序?减少它。
  • 应该删除spacePos = malloc(sizeof(*spacePos[j]));printf("%p", spacePos[j]); 行。 *spacePos[j] 也应该是 (*spacePos)[j]
  • 在更新的代码中,将*ptr2[i]改为(*ptr2)[i]

标签: c arrays string pointers malloc


【解决方案1】:

*ptr2[i] = i; 应该是:

(*ptr2)[i] = i;

你的意思是*(ptr2[i])这是一个错误,因为ptr2只指向一件事。

【讨论】:

    【解决方案2】:

    int *spacePos = NULL;

    find_spaces(name, &amp;spaceCount, &amp;spacePos);

    SpacePos 已经是一个指向int 的指针,并且该指针指向内存中存储整数的某个空间。此指针地址存储在内存中地址&amp;SpacePos 的内存Where in memory are my variables stored in c? 中数据段的某个位置。

    当您将“SpacePos”的地址传递给一个函数并对其进行操作时,您实际上是在更改存储在SpacePos 中的指针值,而不是它指向的值,并且会导致段错误。 (你本质上改变了存储在SpacePos中的内存地址,现在你指向的是无效内存)

    What does "dereferencing" a pointer mean?

    试试find_spaces(name, &amp;spaceCount, spacePos); 希望对您有所帮助。

    ######################### 第2部分

    void test_function(int **ptr2) {

    int i = 0; // Counter
    int j = 10; // Dynamic allocator
    *ptr2 = malloc(sizeof(int) * j); // Allocates 10 slots of size int
    
    for (i = 0; i < 10; i++) {
        *((*ptr2)+i) = i; // <----- This line gives a segmentation fault error
    }
    
    return;
    

    }

    【讨论】:

    • 我想他是想通过&amp;spacePosfind_spaces函数可以动态分配一个数组来存储“返回值”
    • 是的,你的权利(我的错误)我会留下我的评论,因为它可能对 OP 有用,但不要给我任何分数,在这种情况下,如果他说 void *spacepos = NULL 和稍后在他分配内存时将其转换,因为它可能会产生误导?
    • 不,int *spacePos 是正确的,因为它确实会指向int
    • @M.M 嘿,对不起,我在编辑中使我的编码更加简洁。你能检查一下吗?我很感激你们到目前为止为此付出的时间。我仍然需要学习更多关于指针和 malloc 的知识。
    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多