gpt4 book ai didi

c - 以下代码中出现段错误(核心转储)。怎么了?

转载 作者:行者123 更新时间:2023-11-30 21:03:23 24 4
gpt4 key购买 nike

我对 C 比较陌生。我遇到过不少段错误,但我能够在几分钟内找到错误。然而这让我很困惑。这是我试图编写的一个新函数。这基本上是 Python 代码的 C 等价物

    r=t[M:N]

这是我的 C 代码和测试用例

    #include <stdio.h>

char* subarraym(char* a, int M, int N)
{
char* s;
int i;
for (i=M; i<N; i++){ s[i-M]=a[i]; }
return s;
}

main()
{
char* t="Aldehydes and Ketones";
char* r=subarraym(t,2,10);
printf("%c\n",r[4]);
return 0;
}

预期的答案是“d”。但是我遇到了段错误。额外信息:我正在使用 GCC

最佳答案

您的代码将无法工作,因为您的子数组指针从未初始化。您可以复制子数组,但随后您将必须管理内存,这对您的问题来说太过分了。

在 C 语言中,数组通常作为指针和元素数量对传递。例如:

void do_something(char *p, int np);

如果您遵循这个习惯用法,那么假设没有溢出,获取子数组就很简单:

void do_something_sub(char *p, int np, int m, int n)
{
do_array(p + m, n);
}

检查和管理溢出也很容易,但它留给读者作为练习。

注1:一般情况下,你不会编写诸如do_something_sub()之类的函数,只需使用正确的方式直接调用do_something()即可论据。

注释 2:有些人更喜欢使用 size_t 而不是 int 来表示数组大小。 size_t 是无符号类型,因此永远不会有负值。

注释 3:在 C 中,字符串就像 char 数组,但长度是通过以 NUL 字符结尾来确定的,而不是传递长度。因此,要获取以 NUL 结尾的子字符串,您必须将子字符串复制到另一个 char 数组,或者修改原始字符串并用 NUL 覆盖倒数第二个字符。

关于c - 以下代码中出现段错误(核心转储)。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25249262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com