You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建指针数组时遇类型不兼容警告及段错误问题求助

问题分析与解决

核心错误点

  1. 未分配数组内存:主函数中的array是未初始化的指针,createArray函数没有先为其分配内存就直接赋值,导致访问非法内存,触发段错误。
  2. 指针层级混淆:int **array是指向int*的指针(即主函数中array变量的地址),直接用array[index]操作会访问到错误的内存区域,且类型不匹配(将int赋值给int*),引发警告。
  3. scanf格式符错误:size_t类型对应的标准格式符是%zu,而非%ld,避免跨平台兼容性问题。
  4. 函数返回值冗余:arrayElements函数无需返回值,定义为void*属于错误声明。

修正后的代码

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

// 创建数组并赋值
int createArray(int **array, size_t *size) {
    printf("What will be the size of the array?: ");
    // 使用%zu作为size_t的格式符,直接传入size指针(无需&*size)
    if (scanf("%zu", size) != 1) {
        printf("Input error!\n");
        return -1;
    }

    // 为数组分配内存,检查分配是否成功
    *array = malloc(*size * sizeof(int));
    if (*array == NULL) {
        printf("Memory allocation failed!\n");
        return -1;
    }

    // 为数组元素赋值:*array是数组首地址,(*array)[index]访问第index个元素
    for (int index = 0; index < *size; index++) {
        (*array)[index] = rand() % 100;
    }
    printf("\n --- Array created. Pointers: *size, *array --- \n");
    return 0;
}

// 打印数组元素,返回值改为void
void arrayElements(int array[], size_t size) {
    printf("\n --- Printing Elements of array --- \n");
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main(void) {
    int *array = NULL; // 初始化为空指针,避免野指针
    size_t size;
    if (createArray(&array, &size) != 0) {
        return 1;
    }
    arrayElements(array, size);
    
    // 记得释放分配的内存,避免内存泄漏
    free(array);
    return 0;
}

关键修改说明

  • 内存分配:通过*array = malloc(*size * sizeof(int))为主函数中的array指针分配内存,确保有合法的存储空间存放数组元素。
  • 指针操作修正:用(*array)[index]访问数组元素,先通过*array拿到数组的首地址,再通过下标访问对应位置。
  • 输入校验:增加scanf返回值检查,以及malloc空指针检查,提升程序健壮性。
  • 内存释放:主函数中使用free(array)释放分配的内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Raul Chiarella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:35:45