繁体   English   中英

如何在结构体中为c中的字符串创建内存分配?

[英]How to create memory allocation in a struct for a string in c?

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

例如,我创建了一个大小为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);
}

顺便说一句,我试图让你们/女士尽可能清楚地编写代码,以及我需要的主要内容。 我知道我没有释放内存,也没有检查分配是否失败等。

首先要说的是, 请参阅有关为什么不在Cmalloc()和family的返回值的讨论。

来到这里的主要问题, 超出范围的内存访问会导致未定义的行为

因此,基本上,它不限制我的字符串大小,为什么呢?

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

那就是

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

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

malloc授予您写入内存的权限,但是您可以尝试在没有权限的情况下进行写入。 那就是你刚才所做的。 它可能会工作,但可能不会,但是如果正确使用malloc,则应该可以运行此代码,且运行时无错误

当您使用C时,编程工作的主要部分是确保击中您分配的内存的所有数据都将真正适合。 这就是为什么C编程如此痛苦。 它还要求您在不再使用内存时释放您的内存,这在您的示例中已被忘记。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM