【问题标题】:Strange thing about pointers指针的奇怪之处
【发布时间】:2023-04-10 04:18:01
【问题描述】:

我对 VS C++ 有一些误解。在 2010 版中,下面的代码可以正常工作:我可以得到一个字符串,我可以释放内存后记。

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

 #define MAX 14

 void GetString(char **str);

 int main(int argc, char *argv[])
 {
    char *str = NULL;
    GetString(&str);
    printf("%s\n", str);

    getchar();

    free(str);

    return 0;
 }

 void GetString(char **str)
 {
    char *s = (char *) malloc(sizeof(char) * MAX);
    strcpy(s, "HELLO, WORLD!");
    *str = s;
 }

但在 VS 2008 中,上面的代码最终会出现内存损坏错误。我想,使用的标准存在细微差别。 我说的对吗?如果不是,请告诉我,为什么相同的代码不能在不同版本的 Visual Studio 中工作?

提前感谢您的回答。

附言我很好奇会发生什么,但还没有找到有关该主题的任何信息。

p.p.s.使用的语言 - C

【问题讨论】:

  • 在给出代码示例时,通过包含所有必要的标头(在您的情况下为&lt;stdio.h&gt;&lt;stdlib.h&gt;&lt;string.h&gt;)使它们可编译
  • 对不起。我马上做出改变!
  • 嗯...我将您的代码复制粘贴到 VS2008 中,构建并运行它...您猜怎么着?有用。我认为这是你没有告诉我们的事情(比如在 Dll 中声明 GetString 函数?)
  • @Kek 不,我没有。我告诉过你那天早上的情况。我不怀疑它必须起作用。

标签: c visual-studio pointers


【解决方案1】:

您没有包含所需的标头,这意味着您的代码可能会被不同的编译器以不同的方式解释。您应该添加:

#include <stdlib.h>

使malloc() 成为一个定义明确的函数。

你也打电话给strcpy(),所以你需要:

#include <string.h>

并执行您需要的 I/O:

#include <stdio.h>

另外,在 C 中:

char *s = (char *) malloc(sizeof(char) * MAX);

最好写成:

char *s = malloc(MAX);

因为

  1. a bad idea to cast the return value of malloc()
  2. sizeof (char) 始终为 1,因此只会增加混乱。

最后,您当然应该在使用返回的指针之前检查malloc() 是否成功。

【讨论】:

  • 对不起,我没有从文件中复制所有代码。我也不能将此标记为答案。因为这是我能想到的最简单的例子。此外,如果您不在 VS 中强制转换 malloc,它会显示错误! 1 IntelliSense:“void *”类型的值不能用于初始化“char *”类型的实体
  • 此外,如果 malloc 失败,它无论如何都会返回 NULL。并且方法中的 s 变量将为 NULL。 stackoverflow.com/questions/11788803/what-if-malloc-fails 所以,是的,我有一个潜在的风险,一切都会爆炸。但有一点不同的问题。
  • @user1415536​​:您正在尝试将其编译为 C++,不是吗?尝试将其编译为 C,因为你知道,它是 C。
  • @netcoder 它将在 Linux 中工作(gcc 不会显示任何异常或警告)。我已经试过了。
  • @netcoder:这似乎是一个known issue in Visual Studio,即使在VS2015中; intellisense 将 C 文件视为 C++,因此即使源代码实际编译时没有警告,有时也会显示一堆错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2014-09-11
  • 2015-07-17
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多