首页 > 解决方案 > 如何访问和修改函数中的字符串数组?

问题描述

我对 C 相当陌生,我只是在指针上落下,我一直在做练习,我浏览了这个网站和谷歌,但我找不到我要找的东西。(可能是因为对术语没有经验)

上下文我必须使用一个特定的原型(评分程序使用)来传递一个字符串数组但是由于我每个函数限制为 25 行我试图将相同的字符串数组传递给另一个函数无济于事,所以这是我的解决方法:

#include <stdlib.h>

int ft_ultimate_range(int **range, int min, int max)
{
    int *arr;
    int i;
    int j;

    j = 0;
    i = min;
    if (min >= max)
    {
        *range = NULL;
        return (0);
    }
    arr = malloc(sizeof(int) * ((long long int)max - (long long int)min));
    *range = arr;
    if(arr == NULL)
        return (-1);
    while (i < max)
    {
        *range[j] = i;
        i++;
        j++;
    }
    return (j);
}

但是,我在*range[j] = i;/ seg 的 vs 代码上得到了 EXC_BAD_ACCESS (code=1)。在终端上执行时出错。

我不明白为什么这是因为我试图将值分配给传递的数组,如果我把星号取出(不兼容的 int 到指针转换从'int'分配给'int *')。

到底是怎么回事?

你也可以请我指出一个线程解释如何传递字符串数组(或函数之间的int)?

编辑:问题是否有帮助。(我只是想了解什么是错的)

标签: c

解决方案


正如评论中指出的那样,*range[i]可以理解为*(range[i]),遵循运算符优先级的规则。这意味着您正试图进入与调用者提供的地址相邻的内存。

使用(*range)[i],或简单地使用arr您之前创建的变量,将解决这个问题。

while (i < max) {
    arr[j] = i;
    i++;
    j++;
}

话虽如此,您的代码有点复杂。虽然我不完全同意函数行限制的想法,但如果这些是你要学习的约束,你会想要尝试将问题分解成最简单的组件和所需的步骤。

我们需要的唯一额外变量是length范围的计算,以及i我们要插入值的索引。length由于隐式转换,无需转换我们的计算。min已经提供了我们的起始值。

size_t range(int **dest, int min, int max) {
    if (min >= max)
        return *dest = NULL, 0;

    size_t length = max - min;

    if (!(*dest = malloc(sizeof **dest * length)))
        return -1;

    for (size_t i = 0; i < length; i++)
        (*dest)[i] = min++;

    return length;
}

请注意,在此示例中,我已将size_t其用作

[...] 可以存储理论上可能的任何类型(包括数组)对象的最大大小。

并且是索引所述数组的最合适的类型。但是,您需要将每个实例更改size_tint以匹配您的规范。


在 C 中,字符串是指一系列非零字节,后跟 NUL 终止字节 ( '\0')。

字符串示例:

const char *foo = "hello, world";
char bar[] = "Alice";
char baz[] = { 'B', 'o', 'b', '\0' };

您的代码中没有字符串。main通过查看函数及其第二个参数,可以找到传递字符串数组的示例。


推荐阅读