【问题标题】:Novice C programmer having trouble with strings & malloc新手 C 程序员遇到字符串和 malloc 问题
【发布时间】:2020-07-26 23:08:09
【问题描述】:

我从 C 编程开始,目前正在研究结构并使用指针来处理它们。我一直在尝试编写一个简单的程序来存储您的个人详细信息(姓名和生日)以供练习,但是我在内存分配方面遇到了问题,而且我显然遗漏了一些东西 - 所以我尝试了一些更简单的方法,显然我'在为字符串分配内存时遇到问题。我已经尽力调试这个,但我不知道出了什么问题。

#include<stdio.h>
#include<stdlib.h>
#include<stddef.h>
#include<string.h>
int main()
{
    char DummyString[100];
    printf("Enter a string to be read back to you: ");
    scanf("%s",&DummyString);
    printf("The string is: %s\n",DummyString);
    printf("String length is %d\n",strlen(DummyString));
    printf("sizeof char is %i\n",sizeof(char*));
    // char DumbStringPtr=&DumbString;
    char *DummyStringPtr = (char*)malloc((sizeof(char))*(strlen(DummyString)+1)); // returns 8 regardless of anything
    printf("The size of the pointer would be %d\n", sizeof(DummyStringPtr));
}

在原始程序中,失败是在尝试将字符串复制到分配的指针之后,我假设这是由于内存不足(必要时将显示代码)。 我觉得我错过了一些基本的东西,所以很感激任何反馈。 如果有人能指导我解决我的错误,我将不胜感激。谢谢!

【问题讨论】:

  • 这个问题我不清楚。 "// 不管什么都返回 8" 是什么意思?返回 8 是什么? malloc ? strlen
  • scanf("%s",&amp;DummyString); 其中DummyString 已经是一个指针(数组/指针转换),所以在DummyString 之前没有'&amp;'... 如果没有检查退货。 (当晚最重要的一课)
  • 这一行:printf("sizeof char is %i\n",sizeof(char*)); 很奇怪。打印出来的文字是 sizeof char,但你使用 sizeof char pointer。请注意,sizeof(char) 始终为 1
  • 您好,感谢您的意见!我的意图是尝试跟踪我分配了多少内存,但我只是返回了指针的大小。其余的(比如 sizeof(char) 是疯狂的调试尝试:)
  • 关于:scanf("%s",&amp;DummyString); 1) '裸' 数组名称降级为数组第一个字节的地址。在数组名称前放置&amp; 会导致编译器输出警告消息,这不是您想要的。 2) 当使用“输入格式转换”说明符%s 和/或%[...] 时,总是包含比输入缓冲区长度小1 的MAX CHARACTERS 修饰符,因为这些说明符总是将NUL 字节附加到输入。这也避免了缓冲区溢出和随之而来的未定义行为(续)

标签: c pointers malloc strcpy strlen


【解决方案1】:
  • scanf("%s",&amp;DummyString); 是错误的。因为DummyString 是一个数组,所以当你在表达式中使用它时,你会得到一个指向它的第一个元素的指针,这就是 scanf 所期望的。改为scanf("%s",DummyString);
  • malloc 行太臃肿了,干脆做
    char *DummyStringPtr = malloc(strlen(DummyString)+1));
  • 无论指针指向何处,指针的大小始终为 4(或 8 等)。 sizeof 不会告诉你分配了多少内存。您必须自己跟踪这一点,如果需要,可以使用单独的大小变量。
  • sizeof 结果的正确 printf 转换说明符是 %zu,因为 sizeof 返回类型 size_t。新手快速肮脏的版本是使用printf("%d", (int)sizeof(something));
  • 总是free(DummyStringPtr);

【讨论】:

  • @TomKarzes 对新手不必要的迂腐,但足够公平。
  • 当然!这些都是有道理的。打算根据这个尝试编辑。谢谢!如何跟踪我分配的内存量?
  • @dkd6 只需执行int size = strlen(dummyString)+1; ... malloc(size); 之类的操作。 (再次强调,正确的整数类型实际上是 size_t 而不是 int,但新手需要担心这一点)
  • if (scanf("%99s", DummyString) != 1) { ... } 始终使用 field-width 修饰符来保护您的数组边界(否则 scanf() 并不比 gets() 好)并始终检查返回(您覆盖其余部分)
  • 太棒了!谢谢大家帮助新手:) 我现在有很多申请!
猜你喜欢
  • 2013-12-27
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多