变量在 C 中自行更改其值

variable changing its value on its own in c

提问人:GjdGr8 提问时间:6/15/2023 最后编辑:GjdGr8 更新时间:6/15/2023 访问量:78

问:

就上下文而言,我是 C 语言的初学者,我正在制作一个包含该语言所有重要细节的文件,我注意到我在开始时定义的变量(类型)似乎在程序中更改了它的值,当我使用指针访问它时。int

这是代码的进行方式(我删除了解释每行的所有注释(bc 我是初学者))

#include <stdio.h>
#include <string.h>

int main() {

    printf("Hello World\n");

    int uninitialisedArrayOfInt[4];

    int initialisedArrayOfInt[] = {0, 1, 2, 3};


    int len = sizeof(uninitialisedArrayOfInt)/sizeof(int);


    for (int i = 0; i < len; i++){
        uninitialisedArrayOfInt[i] = i+1;
        initialisedArrayOfInt[i] = i+2;
    }



    int i = 0;

    while(i<len){
        printf("%i\n", uninitialisedArrayOfInt[i]);
        i++;
    }


    int arr[1][1];


    char str1[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'}; 
    printf("%s\n", str1);

    char str2[] = "Hello World!";
    printf("%s\n", str2);


    int len2 = strlen(str1);
    printf("%i\n", len2);



    strcat(str1, str2); //the len values changes from this step to the next
    printf("%s\n", str1); //len becomes 1919899424


    char copycat[sizeof(str2)];
    strcpy(copycat, str2);
    printf("%s\n", copycat);



    int* lenPtr = &len;
    printf("%p\n", lenPtr);



    printf("%i\n", *lenPtr);
    *lenPtr = 200;
    printf("%i\n", len);

}

有趣的是,我只在开头和结尾处玩弄,但是在我连接和 的行上,值变为(它变了)。len1919899424str1str2

正如你们所知道的,我在 vscode 中运行了这段代码,我使用的编译器和调试器是 gcc 和 gdb。

我必须包含整个代码,因为没有它就不会发生错误

正如许多人所困惑的那样,该函数不会更改此处解释的值 (https://www.codecademy.com/courses/learn-c-arrays-and-strings/lessons/strings-c/exercises/concatenating-strings#:~:text=What%20actually%20happens%20is%20the%20function%20takes%20the%20two%20strings%20and%20creates%20a%20char%20array%20of%20size%20strlen(src)%20%2B%20strlen(dst)%20%2B%201。strcat()len)

C 指针 变量

评论

1赞 Oka 6/15/2023
strcat(str1, str2);- 数组是固定大小的(此处由其初始值设定项决定),并且不会神奇地增长以容纳更多数据。您正在调用未定义的行为
1赞 n. m. could be an AI 6/15/2023
“通过删除 str1 并重新创建它”这绝对不是链接所说的。您不能删除一个变量并在其位置创建另一个不同大小的变量。这不是 C 的工作方式。
2赞 n. m. could be an AI 6/15/2023
对不起,我看错了地方。是的,这就是这个链接所说的,这是大错特错的。停止使用该网站。
2赞 n. m. could be an AI 6/15/2023
strcat()无法更改数组变量的大小。没有什么可以。这并不意味着这是不够的。相反,这意味着您误用并且您的数组不足。它的大小应该足以包含您要放入其中的内容。strcat()strcat()
1赞 n. m. could be an AI 6/15/2023
该教程,或者至少是您链接的章节,是完整的,完全是垃圾。仅仅通过阅读它,我就变成了一个差 5% 的程序员。

答:

2赞 i486 6/15/2023 #1

中没有可用空间来连接其他字符串。修改数组外部的内存并更改变量的值(在本例中)后。str1concatstr1len

评论

0赞 GjdGr8 6/15/2023
正如我之前所说,该函数会处理这个问题,如这里所述(codecademy.com/courses/learn-c-arrays-and-strings/lessons/......strcat())
4赞 BoP 6/15/2023
但正如这里提到的,strcat 引用它没有。似乎你读了一个比你懂 C 的人的教程。在互联网上一直发生。:-(
0赞 GjdGr8 6/15/2023
是的,:(,我想我会改变我的路线。