我确实理解该错误,但不知道正确的解决方案是什么。它说
Array 'filename' of size 512 may use index value(s) MIN..1022
是不是因为strncat
是在strncpy
之后调用的?
我尝试执行 strlen
,但这引入了一些其他错误。
#define MAX_SIZE 512
void some_function(const char *path) /*path is also char
array of size 512*/
{
char filename[MAX_SIZE]="";
char *attr = "/funct";
strncpy(filename, path, sizeof(filename));
strncat(filename, attr, sizeof(filename)); //error line
}
有没有合适的解决方案。
最佳答案
如果您使用函数strncpy
,那么您必须将其最后一个字符设置为零字符“\0”。否则无法保证字符数组中包含字符串。
以这种方式使用strncat
strncat(filename, attr, sizeof(filename));
没有意义。数组filename
可能没有足够的空间来容纳字符串attr
。但是您正在尝试将 sizeof(filename)
字符复制到已经可以完全填充的数组中。
您必须“手动”检查目标数组是否包含足够的空间来将新字符串附加到已存储的字符串中。
因此使用函数 strncat
是没有意义的,因为在任何情况下结果路径都将无效。
您可以使用下面演示程序中所示的方法。
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 512
void some_function(const char *path )
{
char filename[MAX_SIZE] = "";
const char *attr = "/funct";
size_t n = strlen( attr );
strncpy( filename, path, sizeof (filename ) );
filename[ MAX_SIZE - 1] = '\0';
if ( n < MAX_SIZE - strlen( filename ) )
{
strcat( filename, attr );
}
puts( filename );
}
int main(void)
{
const char *path = "/path";
some_function( path );
return 0;
}
或者您可以在函数的最开始检查数组是否可以包含这两个字符串。例如
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 512
void some_function(const char *path )
{
char filename[MAX_SIZE] = "";
const char *attr = "/funct";
size_t n1 = strlen( path );
size_t n2 = strlen( attr );
if ( n1 + n2 < MAX_SIZE )
{
strcpy( filename, path );
strcpy( filename + n1, attr );
}
puts( filename );
}
int main(void)
{
const char *path = "/path";
some_function( path );
return 0;
}
关于c - 我遇到了 "Buffer overflow-array index out of bounds"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57081303/