c - 如何访问和修改函数中的字符串数组?
问题描述
我对 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)?
编辑:问题是否有帮助。(我只是想了解什么是错的)
创建一个函数 ft_ultimate_range,它分配和分配一个整数数组。
此 int 数组应包含最小值和最大值之间的所有值。包含最小值 - 排除最大值。
以下是它应该如何原型化:
int ft_ultimate_range(int **range, int min, int max);
应该返回范围的大小(或 -1 错误)。*如果 min 的值大于或等于 max 的值,range 将指向 NULL,它应该返回 0
解决方案
正如评论中指出的那样,*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_t
为int
以匹配您的规范。
在 C 中,字符串是指一系列非零字节,后跟 NUL 终止字节 ( '\0'
)。
字符串示例:
const char *foo = "hello, world";
char bar[] = "Alice";
char baz[] = { 'B', 'o', 'b', '\0' };
您的代码中没有字符串。main
通过查看函数及其第二个参数,可以找到传递字符串数组的示例。
推荐阅读
- powershell - Nested try catch when copying a file
- javascript - 具有相同键和值的变量的打字稿对象初始化得到类型错误
- html - 动画 div 高度而不扭曲图像
- java - JSP scriptlet 变量 分配给脚本变量?
- regex - 如果单元格值包含数据中的单词,我如何使用查询公式获取值?
- flutter - Map中的Flutter设置属性导致UnsupportedError(不支持的操作:只读)
- c# - 为什么我们必须在 C# 中等待异步方法调用
- java - Android 应用需要双击登录
- sql - 我如何解释同时处理的过程不会破坏数据库?
- javascript - 变换:旋转();在 Firefox 中抛出警告