使用 malloc 时的奇怪行为

伯恩哈德

我是C新手,在使用 malloc 时遇到了奇怪的行为。

我从 stdin (fgets) 读取输入文本并将其传递给函数 myfunction。

void myfunction(char* src) {

     printf("src: |%s|\n", src);

     int srcLength = strlen(src);
     printf("src length: %d\n", srcLength);

     // CAUSES ODD BEHAVIOR IN MY SITUATION
     // char* output = malloc(200);
     //
     // if (output == NULL) {
     //   exit(EXIT_FAILURE);
     // }

     for (int i=0; i < srcLength; ++i) {
       char currChar = src[i];
       printf("|%c| ", currChar);
     }
}

在没有 malloc 的情况下执行函数时(见评论),我得到这个:

src: |asdf|
src length: 4
|a| |s| |d| |f|

但是使用 malloc,我得到了这种尴尬的行为。好像 char* 中没有字符:

src: |asdf|
src length: 4
|| || || || 

char* src(来自标准输入)可能存在问题。但我不确定,因为输入字符串打印正确 ( src: |asdf|)。

有人可以支持我,如何分析问题的根源?

更新1:

这是从 stdin 读取并调用 myfunction 的代码。

int main(int argc, char **argv) {

  char *input = NULL;
  input = readStdin();
  myfunction(input);
  return EXIT_SUCCESS;
}

char* readStdin(void) {
    char buffer[400];
    char *text = fgets(buffer, sizeof(buffer), stdin);
    return text;
}

myfunctionreadStdin在不同的文件,但我希望这没关系。

更新 2:

正如支持者在评论中提出的那样,我解决了范围问题。

我将的函数原型更改readStdin为:

 char* readStdin(char* input);

readStdin用分配的input.

 char* input = malloc(400);

readStdin我替换buffer为函数参数。

4386427

使用 malloc 时的奇怪行为

是的,这很奇怪……或者也许不是。您的代码具有未定义的行为,因此一切都可能发生。

问题是它text最终会成为一个指向bufferiffgets是否成功的指针但是buffer是函数中的局部变量,因此一旦readStdin返回该变量buffer就不再存在。因此,您传递myfunction了一个无效的指针,当您使用它(即读/写)时,您有未定义的行为。

一旦你有未定义的行为,就没有任何意义来推理正在发生的事情......但如果我们无论如何都尝试这样做,对大多数系统的可能解释是:

buffer位于堆栈上。readStdin返回时,堆栈指针是递减(或递增),使得buffer现在是在堆叠的未使用部分。当你调用一个新函数时,新函数也需要一些栈空间。多少取决于函数使用的变量数量。换句话说 - 变量越多,需要的堆栈空间就越多。由于新变量将覆盖堆栈的某些部分 - 从而覆盖保存过时buffer变量的内存部分- 销毁buffer的数量可能会随着函数调用中变量的数量而变化。这大概就是你看到的。

但请注意,上述解释是特定于系统的。它不是 C 标准指定的内容。尽管如此,这就是大多数系统的工作方式。

该怎么办?

代替

char buffer[400];

char* buffer = malloc(400);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用GDB调试Go时的奇怪行为

来自分类Dev

使用tar时遇到奇怪的行为

来自分类Dev

使用MathJax截断时的奇怪行为

来自分类Dev

使用$时sed的奇怪行为(错误?)

来自分类Dev

使用 char* 时的 C 奇怪行为

来自分类Dev

使用 ArrayLists 时出现奇怪的 NPE 行为

来自分类Dev

在使用CGImageDestinationFinalize时如何避免malloc

来自分类Dev

使用malloc时出现分段错误

来自分类Dev

在SFunction中使用malloc时出错

来自分类Dev

使用Tab控制器时奇怪的滚动行为-iOS

来自分类Dev

使用globlob模式时grunt-contrib-concat的奇怪行为

来自分类Dev

使用Clang生成C ++静态库时的奇怪行为

来自分类Dev

使用C ++专业化模板时的奇怪行为

来自分类Dev

在C ++中使用互斥锁时的奇怪行为

来自分类Dev

使用objc_getAssociatedObject()时出现奇怪的Swift行为

来自分类Dev

SSL在使用对称加密密钥时的奇怪行为?

来自分类Dev

使用Fine Uloader上传缩放的文件时的奇怪行为

来自分类Dev

使用LINQ从Microsoft CRM检索数据时出现奇怪的行为

来自分类Dev

UITableView使用多个原型单元时的奇怪行为

来自分类Dev

在累积API中使用“还原”参数时的奇怪行为

来自分类Dev

使用Spring @TransactionalEventListener发布事件时,奇怪的(循环)的行为

来自分类Dev

使用gganimate时ggplot的geom_polygon的奇怪行为

来自分类Dev

在文本上使用CSS渐变时出现奇怪的行为(Safari)

来自分类Dev

Excel:使用UDF时出现奇怪的#VALUE错误行为

来自分类Dev

使用Timer时SwiftUI中ObservedObject的奇怪行为

来自分类Dev

使用vue getter / setter指向localStorage时的奇怪行为

来自分类Dev

在github站点上使用本地存储时的行为非常奇怪

来自分类Dev

组使用日期函数时mysql的奇怪行为

来自分类Dev

使用smbclient时奇怪的控制台行为

Related 相关文章

  1. 1

    使用GDB调试Go时的奇怪行为

  2. 2

    使用tar时遇到奇怪的行为

  3. 3

    使用MathJax截断时的奇怪行为

  4. 4

    使用$时sed的奇怪行为(错误?)

  5. 5

    使用 char* 时的 C 奇怪行为

  6. 6

    使用 ArrayLists 时出现奇怪的 NPE 行为

  7. 7

    在使用CGImageDestinationFinalize时如何避免malloc

  8. 8

    使用malloc时出现分段错误

  9. 9

    在SFunction中使用malloc时出错

  10. 10

    使用Tab控制器时奇怪的滚动行为-iOS

  11. 11

    使用globlob模式时grunt-contrib-concat的奇怪行为

  12. 12

    使用Clang生成C ++静态库时的奇怪行为

  13. 13

    使用C ++专业化模板时的奇怪行为

  14. 14

    在C ++中使用互斥锁时的奇怪行为

  15. 15

    使用objc_getAssociatedObject()时出现奇怪的Swift行为

  16. 16

    SSL在使用对称加密密钥时的奇怪行为?

  17. 17

    使用Fine Uloader上传缩放的文件时的奇怪行为

  18. 18

    使用LINQ从Microsoft CRM检索数据时出现奇怪的行为

  19. 19

    UITableView使用多个原型单元时的奇怪行为

  20. 20

    在累积API中使用“还原”参数时的奇怪行为

  21. 21

    使用Spring @TransactionalEventListener发布事件时,奇怪的(循环)的行为

  22. 22

    使用gganimate时ggplot的geom_polygon的奇怪行为

  23. 23

    在文本上使用CSS渐变时出现奇怪的行为(Safari)

  24. 24

    Excel:使用UDF时出现奇怪的#VALUE错误行为

  25. 25

    使用Timer时SwiftUI中ObservedObject的奇怪行为

  26. 26

    使用vue getter / setter指向localStorage时的奇怪行为

  27. 27

    在github站点上使用本地存储时的行为非常奇怪

  28. 28

    组使用日期函数时mysql的奇怪行为

  29. 29

    使用smbclient时奇怪的控制台行为

热门标签

归档