我试图理解为什么在printf()
char* extract_word()
{
char* sentences = "hi! i'm a banana!";
int starts = 4;
int ends = 12;
int count;
int nb_char = ends-starts+1;
char* word = malloc(nb_char);
printf("\n\n%d\n",ends-starts);
for(count = starts; count < ends;count++)
{
word[count-starts] = sentences[count];
printf("%c == \n",sentences[count]);
}
word[count-starts+1] = '\0';
printf("\n\n%s",word);
return word;
}
printf
返回:
8 i == ' == m == == a == == b == a == i'm a bau
如果我删除了'\0'
,我会得到类似的内容:
'm a ba¨Á£´
答案 0 :(得分:6)
在您的代码中
word[count-starts+1] = '\0';
是off-by-one,基本上这个越界访问会调用undefined behavior。
您应该将代码更改为
word[nb_char-1] = '\0';
因为,您已分配nb_char
个字节,最后一个索引为nb_char-1
。
也就是说,在使用返回的指针之前,通过检查malloc()
的返回值,始终需要检查NULL
是否成功。
答案 1 :(得分:4)
如果删除snprintf
printf,则无法知道字符串是否结束,并且会一直递增指针,直到它看到空值并且您冒了获得分段错误的风险。
对于最后没有0的字符串,您可以使用memcpy
同样针对您要实现的目标strncpy
或RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-]+)$ user.php?user=$1 [L]
查看手册页以获取更多详细信息。