Memory management 尝试将C中的可用内存空间加倍的含义

Memory management 尝试将C中的可用内存空间加倍的含义,memory-management,stack,heap,Memory Management,Stack,Heap,下面是我的代码: #include <stdio.h> #include<stdlib.h> struct student{ char *name; }; int main() { struct student s; s.name = malloc(sizeof(char *)); // I hope this is the right way... printf("Name: "); sca

下面是我的代码:

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

struct student{
char *name;
};

int main()
{
        struct student s;

        s.name = malloc(sizeof(char *)); // I hope this is the right way...

        printf("Name: ");    
        scanf("%[^\n]", s.name);


        printf("You Entered: \n\n");

        printf("%s\n", s.name);

        free(s.name);   // This will cause my code to break
}
我试着读书

我的结论是,我试图双倍释放一段内存,也就是说,我试图释放一段已经释放的内存?(希望我在这里是正确的。如果是,双重免费会带来什么安全影响?)

虽然它有时会失败,但它应该:

./struct
Name: CrazyFishMotorhead Rider
You Entered: 

CrazyFishMotorhead Rider
*** glibc detected *** ./struct: free(): invalid next size (fast): 0x08adb008 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb7612161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb76139b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb7616a9d]
./struct[0x8048533]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb75bdbd6]
./struct[0x8048441]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:01 288098     /root/struct
08049000-0804a000 r--p 00000000 08:01 288098     /root/struct
0804a000-0804b000 rw-p 00001000 08:01 288098     /root/struct
08adb000-08afc000 rw-p 00000000 00:00 0          [heap]
b7400000-b7421000 rw-p 00000000 00:00 0 
b7421000-b7500000 ---p 00000000 00:00 0 
b7575000-b7592000 r-xp 00000000 08:01 788956     /lib/libgcc_s.so.1
b7592000-b7593000 r--p 0001c000 08:01 788956     /lib/libgcc_s.so.1
b7593000-b7594000 rw-p 0001d000 08:01 788956     /lib/libgcc_s.so.1
b75a6000-b75a7000 rw-p 00000000 00:00 0 
b75a7000-b76fa000 r-xp 00000000 08:01 920678     /lib/tls/i686/cmov/libc-2.11.1.so
b76fa000-b76fc000 r--p 00153000 08:01 920678     /lib/tls/i686/cmov/libc-2.11.1.so
b76fc000-b76fd000 rw-p 00155000 08:01 920678     /lib/tls/i686/cmov/libc-2.11.1.so
b76fd000-b7700000 rw-p 00000000 00:00 0 
b7710000-b7714000 rw-p 00000000 00:00 0 
b7714000-b7715000 r-xp 00000000 00:00 0          [vdso]
b7715000-b7730000 r-xp 00000000 08:01 788898     /lib/ld-2.11.1.so
b7730000-b7731000 r--p 0001a000 08:01 788898     /lib/ld-2.11.1.so
b7731000-b7732000 rw-p 0001b000 08:01 788898     /lib/ld-2.11.1.so
bffd5000-bfff6000 rw-p 00000000 00:00 0          [stack]
Aborted
那么为什么我的代码有时会起作用呢?i、 编译器有时无法检测到我试图释放已释放的内存

它是否与我的堆栈/堆大小有关

 s.name = malloc(sizeof(char *)); // I hope this is the right way...
这不是正确的方法,它分配的内存大小相当于一个字符指针(最有可能是4个字节)

你想要像

s.name = malloc(sizeof(char)*1000);
其中1000是您期望的输入的最大长度

这不是正确的方法,它分配的内存大小相当于一个字符指针(最有可能是4个字节)

你想要像

s.name = malloc(sizeof(char)*1000);

其中,1000是您所期望的输入的最大长度。

PS:如果我使用char name[size],那么我就不需要使用malloc,而且它都是简化的。但是指针数组是引起关注的原因。谢谢你宝贵的回答Keith。所以我发现我的代码在malloc(sizeof(char*))上的最大输入大小是14个字符加上内部空字符,即15个字符。。。使用malloc(sizeof(char)*1000)并没有限制我的输入(即使我使用了*1,你说这是一个bug。我想知道是否有可能通过使用外部恶意脚本来崩溃程序,该脚本可以无限期地将字符打印到此程序中…PS:如果我使用char name[size],那么我就不需要使用malloc了,它完全简化了。但是指针数组是引起关注的原因。谢谢你宝贵的回答Keith。所以我发现我的代码使用malloc(sizeof(char*))时的最大输入大小是14个字符加上内部空字符,即15个字符…并且使用malloc(sizeof(char)*1000)不限制我的输入(即使我使用了*1,你说这是一个bug。我想知道是否有可能通过使用外部恶意脚本将字符无限期地打印到这个程序中来使程序崩溃…感谢你的回复Keith。现在它工作得很好。但是,现在输入的最大大小是多少?是4000字节吗?这就是我在used:s.name=malloc(sizeof(char*)*4000);no.…它的platfrom-specific,但最像sizeof(char)==1.…sizeof(char*))=4我写的意思是你可以存储1000个字符。可能,没有太多的保护,但这是一个bug,这是C的诀窍,它看起来运行正常,但在后台,它做了一些不好的事情。谢谢你的回复Keith。现在它工作得很好。但是,现在输入的最大大小是多少?是4000字节吗?这是我使用的是:s.name=malloc(sizeof(char*)*4000);不…。它的platfrom-specific,但最像是sizeof(char)==1…。sizeof(char*)=4我写的意思是你可以存储1000个字符。可能,没有太多的保护,但这是一个bug,这就是C的诀窍,它看起来运行正常,但在后台,它做了一些不好的事情