count
is greater than the length of
strSource
, the destination string is padded with null characters up to length
count
. The behavior of
strncpy
is undefined if the source and destination strings overlap.
1。 第三个参数count其实隐含是指拷贝的最多字节数;(下面2,3是“最多”的确切含义)
2。 如果count<=strlen(strSource)的话,将会在strDest的后面粘贴strSource的前count字节字符,且不会自动补上NULL作为结尾;
3。 如果count> strlen(strSource)的话,将会在strDest的后面粘贴strSource的全部字符,并在最后自动补上count-strlen(strSource)个NULL作为结尾。
下面是引用的一个图片说明(str1为拷贝目的,str2为拷贝源。例1中n=3, 例2中n=8)——
②char *strncat(
char *strDest,
const char *strSource,
size_t count
strSource overwrites the terminating null character of
strDest. If a null character appears in
strSource before
count characters are appended,
strncat appends all characters from
strSource, up to the null character. If
count is greater than the length of
strSource, the length of
strSource is used in place of
count.
The all cases, the resulting string is terminated with a null character. If copying takes place between strings that overlap, the behavior is undefined.
1。与strncpy类似,strncat也是最多取strSource先头的count个字符粘贴到strDest,并在结尾自动补上NULL;
2。如果cout > strlen(strSource)的话,则第三个参数相当于传入了strlen(strSource),即粘贴strSource的所有字符至strDest。
下面是引用的一个图片说明(str1为拷贝目的,str2为拷贝源。例1中n=3, 例2中n=10)——
最后,终于可以理解visual Studio报的一个报告——
strncpy(szTarget,szCity, MAX);
szTarget[MAX -1] = '\0';
strncat(szTarget, szState, MAX - strlen(szTarget)); // correct size
// code ...
}
直接运行上面这个例子倒不会出问题,如果在szState的后面再加6个字符(比如6个空格),这时一旦运行这段小程序,会报Run-time Check Failure #2 - stack around the variable 'szTarget' was corrupted. 为什么呢??原来啊,strncat的第三个参数传入的应该是“缓冲区内的剩余字符数”而不是“剩余缓冲区大小”哦。故只需要修改第三个参数为(MAX - strlen(szTarget) - 1)即可。
翻译一下说限制5(意思是
strn
cat
的
第三个
参数
是5,这个
第三个
参数
就是一个限制长度的
参数
),和源串的长度相等。从这里可以看到,没有任何根据就要上报,目的是为了防止可能的缓存溢出:源串的长度不能等于限定的长度,即使目的的长度不可知(虽然将限定长度设置为源串的长度是普遍做法)。这里也是很简单,根据源串指针,及限定长度,求一个字符串长度,也就是如果源串长的话,去n作为最终的值,如果串短,使用短的长度,最后使用memcpy做内存复制。这个函数在编译时,gcc会使用一下优化选项,记缓存溢出的检查。
用
strncpy
字符串拷贝时,出现
警告
:warning: '
strncpy
'
specified
bound
32
equals
destination size [-W
string
op-trun
cat
ion]。
2、解决:
strncpy
不拷贝最后一个字节,手动给它赋值'\0'。
#define SIZE = 20;
char *a_str = "12345678";
1.fatal error curses.h no such file or directory
sudo apt-get install libncurses5-dev libncursesw5-dev
2.gcc: error: unrecognized command line option ‘-mlittle-endian’
make时加上交叉编译器CROSS_COMPILE=/usr/bin/arm-linux-gnueab
/home/tsrj/tsjdk8-project/tsjdk8-252/hotspot/src/share/vm/runtime/arguments.cpp: In static member
function
‘static void Arguments::fix_appclasspath()’:
/home/tsrj/tsjdk8-project/tsjdk8-252/hotspot/src/share/vm/runtime/arguments.cpp:3459:12: err
最近项目需要使用最新的 Ubuntu 20.4,查看下 编译器版本居然是 9.4.0,自然项目迁移过程中会有很多编译问题需要解决,毕竟之前的 gcc 版本都是 4.8.5的,差距很大。
lm@lm:~$ uname -a
Linux leimin 5.4.0-107-generic #121-Ubuntu SMP Thu Mar 24 16:04:27 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
lm@lm:~$ gcc -v
Using built-in
error: '__builtin_
strncpy
'
specified
bound
depends on the
length
of the
source
argument
背景:对一块
string
对象进行拷贝到char数组的时候发现数据缺失了。分析:由于在拷贝的时候使用的是
strncpy
,而
strncpy
在复制的时候,在遇到’\0’时,先复制过去,然后的把dest剩下置为了0。所以,一旦源字符串中存在\0则会导致源数据被截断。为此我们可以采用memcpy进行拷贝操作(snprintf 拷贝的时候遇到\0 也会停止)。各个拷贝函数的比较:
strncpy
:
strncpy
比
内核编译unrecognized command line option “-milittle-endian”解决方案:
设置环境变量即可:export CROSS_COMPILE=”aarch64-linux-gnu-”