不同字符串声明范围的混淆

问题描述 投票:0回答:1

我对 C 中特定形式的字符串声明可以做什么感到困惑(例如指针表示法、数组表示法、分配数组)。主要是我在更改字符串或比较两个字符串时遇到问题。我不明白为什么某件事允许一个声明而不是其他声明背后的确切逻辑。我在这里简单说明一下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char *str1 = "HelloWorld";
    char str2[] = "HelloWorld";
    char *str3 = (char *)malloc(11 * sizeof(char));
    str3 = "HelloWorld";
    printf("str1 = %s, str2 = %s, str3 = %s\n", str1, str2, str3);
    str1 = "Hello"; 
    //str2 = "Hello"; doesn't work .. instead we use strcpy(str2, "Hello");
    str3 = "Hello";
    printf("Enter new str2: ");
    scanf(" %s", str2);
    printf("str1 = %s, str2 = %s, str3 = %s\n", str1, str2, str3);
    return 0;
}

我正在寻找对这些操作的解释,如果可能的话更多这样的字符串操作,这通常会导致分段错误或其他错误。我还听说通常首选使用 strcpy 和 strcmp 而不是 = 和 ==。为什么会这样呢?什么时候我们需要小心呢?

c
1个回答
0
投票
char *str1 = "HelloWorld";
  • "HelloWorld"
    是字符串文字,其生命周期与程序相同。字符串文字无法修改。
  • str1
    是指针,它保存对字符串文字的引用
char str2[] = "HelloWorld";
  • str2
    是具有
    strlen("HelloWorld") + 1
    元素的 char 数组。字符串文字被复制到该数组中。该数组可以修改。
char *str3 = malloc(11 * sizeof(char));
  • str3
    是一个指向 char 的指针,该指针保存对使用 malloc 函数分配的内存的引用。分配的内存具有生命周期,直到被
    free
    函数或程序终止释放为止。

str1
str2
str3
是主函数的本地函数。

© www.soinside.com 2019 - 2024. All rights reserved.