Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc意外分配内存_C_String_Malloc - Fatal编程技术网

malloc意外分配内存

malloc意外分配内存,c,string,malloc,C,String,Malloc,下面是一个分配一些内存并将字符串复制到内存中的代码 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ char *t ="your_char"; char *s = (char*)malloc(9);

下面是一个分配一些内存并将字符串复制到内存中的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
  
int main(){
   char *t ="your_char";

   char *s = (char*)malloc(9);
                                                                                                                                    
   memcpy(s,t,9); 

   printf("%s\n",t);
   printf("%s",s);
   return 0;
}
这是我无法理解的。如果我改为
memcpy(s,t,10)
,那么末尾就没有垃圾值


我假设这是因为在第二种情况下也会复制空终止符但是,当我只分配了9个字节并且它们已经被我复制的字符占用时,为什么会有一个空的位置呢?

一个字符串是一个以null结尾的字符数组(“null字符”是数值为0的字符)。空字符标记字符串的结尾,如果数组中没有空字符,则它不是字符串。特别是,不能使用
%s
说明符
printf
对其进行排序,因为
printf
不知道它的结尾


字符串文本总是自动有一个,例如,
“您的字符”
中有十个字符,而不是九个。如果动态分配字符串,则应始终考虑额外的字符。

字符串是以null结尾的字符数组。
(“null字符”是数值为0的字符)。空字符标记字符串的结尾,如果数组中没有空字符,则它不是字符串。特别是,不能使用
%s
说明符
printf
对其进行排序,因为
printf
不知道它的结尾


字符串文本总是自动有一个,例如,
“您的字符”
中有十个字符,而不是九个。如果动态分配字符串,则应始终考虑额外的字符。

C字符串有一个零字节,用于标记字符串的结尾。因此,当您计算零字节时,“您的字符”需要10个字节,您需要
malloc
10个字节,然后复制所有10个字节。否则,
printf
不知道字符串的结尾
printf
无法知道传递给
malloc
的号码。它所做的只是寻找零字节来知道字符串的结束位置。如果你超出了分配的空间,就不能保证代码会失败,就像你每次违法都会被逮捕一样。你今天侥幸逃脱,但明天可能不行。这并不是一个“空位”:当时并没有竞争对手,而且它碰巧并没有损坏任何东西。处理器按照要求去做。如果它破坏了某些东西,任务就会失败,如果它没有,错误就会被忽略。如果您坚持语言规则,就不会有失败的风险。因为没有复制nul终止符,所以当您尝试打印字符串时,处理器会继续打印它找到的任何内容,直到发生以下两种情况之一:它在内存中找到随机0,或者它尝试读取不允许读取的内存。尝试读取超出已分配内存末尾的内存具有未定义的行为。最糟糕的未定义行为形式是程序正在做您期望它做的事情(因为您仍然有一个bug,但很难检测到)。行为可能是一致的,也可能是不一致的。两次看到它的行为都是一样的,你不能得出任何真正的结论。C字符串有一个零字节来标记字符串的结尾。因此,当您计算零字节时,“您的字符”需要10个字节,您需要
malloc
10个字节,然后复制所有10个字节。否则,
printf
不知道字符串的结尾
printf
无法知道传递给
malloc
的号码。它所做的只是寻找零字节来知道字符串的结束位置。如果你超出了分配的空间,就不能保证代码会失败,就像你每次违法都会被逮捕一样。你今天侥幸逃脱,但明天可能不行。这并不是一个“空位”:当时并没有竞争对手,而且它碰巧并没有损坏任何东西。处理器按照要求去做。如果它破坏了某些东西,任务就会失败,如果它没有,错误就会被忽略。如果您坚持语言规则,就不会有失败的风险。因为没有复制nul终止符,所以当您尝试打印字符串时,处理器会继续打印它找到的任何内容,直到发生以下两种情况之一:它在内存中找到随机0,或者它尝试读取不允许读取的内存。尝试读取超出已分配内存末尾的内存具有未定义的行为。最糟糕的未定义行为形式是程序正在做您期望它做的事情(因为您仍然有一个bug,但很难检测到)。行为可能是一致的,也可能是不一致的。你不能从两次看到它以同样的方式运行得出任何真正的结论。你是对的,
“你的字符”
有10个字符,但我只为
s
分配了9个字节。如果我做了
char*s=(char*)malloc(strlen(temp)*sizeof(char)+1)
那么这可能很重要,但我手动指定了9个字节,那么
s
如何指向9个字节+空字节。运行此代码:char tabstr[]=“your_char”;printf(“tabstr的字节大小:%d”,sizeof(tabstr))@loop先生指向9字节+空字节“不,不是。您只分配了9个字节,因此;s
s
所指的内容。除了这9个字节之外,没有任何内容。mr.loop s指向的是一个线性内存地址,您最多可以修改9个连续字符。您在这9个字符之前或之后所做的任何修改都违反了malloc()合同,可能会给您带来麻烦。@mr.loop您不仅应该分配10个字符,还应该复制10个字符。您是对的,
“您的字符”
有10个字符,但我只为
s
分配了9个字节。如果我做了
char*s=(char*)malloc(strlen(temp)*sizeof(char)+1)
,那么这可能很重要,但我手动指定了9个字节
your_char
your_char☺╚