gpt4 book ai didi

c - "sprintf"使用 Visual Studio 2013 引发异常

转载 作者:行者123 更新时间:2023-11-30 21:14:51 25 4
gpt4 key购买 nike

我尝试使用以下方法编译该程序:

  • Visual Studio 2013
  • 沃科姆

在 Watcom 上它可以完美编译并运行。

在 Visual Studio 上,第二个 sprintf 引发异常。

程序:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
//-------------------------------------------------------//
char *filename = 0;
filename = (char *)malloc(100* sizeof(char)); // allocate

sprintf(filename, "Test"); // write to string ok

filename = "Test"; // write to string

sprintf(filename, "Test"); // write to string fails VisualStudio2013.

getchar();
}

我不明白发生了什么。谁能解释一下吗?

最佳答案

TL;博士:

filename = "Test";

不将“Test”的内容写入filename。它使它指向字符串文字“Test”

<小时/>

说明:

char        *filename = 0;

文件名指向NULL

filename = (char *)malloc(100* sizeof(char));

filename 现在指向已分配内存段的开头(假设 malloc 成功分配内存)。

sprintf(filename, "Test");

从当前指向的一个文件名开始的5个槽位填充有“Test”字符。换句话说,“Test” 被写入filename

filename = "Test";

filename 指向的位置已更改,现在它指向字符串文字 "Test" (具体来说,它指向字符串文字“Test”)。因此,您会失去对已分配内存的跟踪,从而导致内存泄漏,因为您不会(也不能,因为您已经失去了对已分配内存的跟踪)在使用后释放已分配的内存。

sprintf(filename, "Test");

上面的sprintf“Test”写入filename指向的位置。

但是,字符串文字是不可变的,这意味着它们不能更改。尝试更改字符串文字的内容会导致未定义的行为。因此,写入该位置会更改 filename 指向的字符串文字的内容,从而导致未定义的行为。

关于c - "sprintf"使用 Visual Studio 2013 引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32497116/

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