gpt4 book ai didi

arrays - 在将字符串传递给函数之间感到困惑 (C)

转载 作者:行者123 更新时间:2023-12-05 01:23:40 25 4
gpt4 key购买 nike

为什么会这样:

#include <stdio.h>
void slice(char *st, int m, int n)
{
int i = 0;
while ((i + m) < n)
{
st[i] = st[i + m];
i++;
}
st[i-1] = '\0';
}

int main()
{
char st[] = "Hello";
slice(st, 1, 6);
printf("The value of string is %s\n", st);
return 0;
}

这不是:

#include <stdio.h>
void slice(char *st, int m, int n)
{
int i = 0;
while ((i + m) < n)
{
st[i] = st[i + m];
i++;
}
st[i-1] = '\0';
}

int main()
{
char*st = "Hello";
slice(st, 1, 6);
printf("The value of string is %s\n", st);
return 0;
}

首先我使用以下方法初始化我的字符串:

  • char st[]="Hello";(使用数组)

在后面我使用了:

  • char*st="Hello";(使用指针)

我对这两种初始化类型感到困惑,使用 char st[]="Hello"; 和使用 char* 声明字符串之间的主要区别是什么st = "你好";.

最佳答案

对于 char st[] = "Hello";st[] 是一个可修改的字符数组。调用 slice(st, 1, 6); 获取数组 st 并将其转换为指向数组第一个元素的指针。 slice() 然后接收该指针,一个指向可修改字符的指针。

对于 char *st = "Hello";st 是一个指针,它指向一个字符串文字 “你好”。通过调用 slice(st, 1, 6);,函数接收到指针的副本 - 指向字符串文字的指针。在 slice() 中,代码 st[i] = ... 试图修改一个字符串文字,即未定义的行为 (UB)。它可能有效,也可能失败,今天可能有效,明天可能失败 - 它没有定义。

不要尝试修改字符串文字


... passing strings to a function ...

在这两种情况下,代码都不会将字符串 传递给slice(),而是将指针 传递给字符串。了解这种微妙的区别有助于理解真正发生的事情。

关于arrays - 在将字符串传递给函数之间感到困惑 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72073704/

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