【问题标题】:How to create memory allocation in a struct for a string in c?如何在结构中为c中的字符串创建内存分配?
【发布时间】:2016-04-07 12:25:14
【问题描述】:

我有一点问题。 我会解释一下,我正在尝试为结构内的字符串创建动态内存分配并打印它。 问题是,它不关心我动态分配的大小。

例如,我创建了一个大小为 6 的字符串,但它让我插入 15 个字符并全部打印出来。

所以基本上,它不会限制我的字符串大小,为什么会这样?

typedef struct{
    int grade;
    int id;
    int arr[5];
    char *str;
}student;

int main(){
    puts("How many many letters in char?\n");
    scanf("%d", &num);
    getchar();
    student1.str = (char *)malloc(sizeof(char)*num+1);
    gets(buffer);
    strcopy(student1.str, buffer);
}

顺便说一句,我尽量让你们/女士们清楚代码,只是我需要的主要内容。我知道我没有释放内存或检查分配是否失败等...

【问题讨论】:

  • strcopy?认真的吗?
  • 这就是 C 的工作方式。该语言没有自动边界检查。通过访问越界内存,您正在调用未定义的行为。 UB 意味着不能依赖任何特定的行为(它可能看起来有效,可能会输出垃圾,可能会崩溃,可能会冻结等)。
  • 这与结构无关,甚至与动态分配无关。试试char s[5]; strcpy(s, "Hello world! This is a really long string, much longer than the 5 characters allocated for this variable."); printf("%s\n", s); - 有合理的机会它会打印完整的字符串,然后崩溃。 (当然不能保证)

标签: c string dynamic-memory-allocation


【解决方案1】:

首先要说的是please see this discussion on why not to cast the return value of malloc() and family in C.

来到这里的主要问题,超出范围内存访问导致undefined behavior

所以基本上,它并没有限制我的字符串大小,为什么会这样?

C 标准本身没有任何内容可以防止您访问超出范围的内存(即访问未分配给您的进程的内存),但是任何这样做的尝试都会导致 UB。 不要这样做

也就是说,

  1. 永远不要使用gets(),它会出现缓冲区溢出问题,请改用fgets()

  2. sizeof(char) 在 C 中定义为 1。将其用作乘数是多余的。

【讨论】:

  • 我了解到在 malloc 中使用 sizeof 是一种很好的做法,始终如此。这不是真的吗?还是 char 是唯一的例外?
  • @CIsForCookies as sizeof(char) 为 1,如果您愿意,我们可以说这是一个例外。
【解决方案2】:

malloc 授予您写入内存的权限,但您可以在未经许可的情况下尝试写入。这就是你刚才所做的。它可能有效,也可能无效,但如果您正确使用 malloc,您应该能够无运行时错误地运行此代码

【讨论】:

    【解决方案3】:

    当您使用 C 时,编程工作的一个主要部分是确保任何到达您分配的内存的数据实际上都适合。这就是为什么 C 编程会如此痛苦的原因。它还要求您在不再使用内存时释放内存,而您在示例中忘记了这一点。

    【讨论】:

    • “我知道我没有释放内存或检查分配是否失败等...”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2013-08-17
    相关资源
    最近更新 更多