gpt4 book ai didi

c - strcat 在循环中导致段错误

转载 作者:行者123 更新时间:2023-11-30 18:32:08 24 4
gpt4 key购买 nike

我正在虚拟机中运行程序。我正在执行一个循环,在其中的某个时刻,我调用 strcat.经过一定数量的循环(该数量在不同的执行之间会发生变化)后,我收到段错误。

我尝试调试它:

(gdb) backtrace

0 0x001a3d5d in strcat () from /lib/tls/i686/cmov/libc.so.6

1 0x080493f4 in ChangetoDnsNameFormat (dns=0xbffef313 "",
host=0xbffff3b8 "a.com", '.' <repeats 195 times>...) at my_dns.c:378

2 0x08048c96 in nreplacehost (
host=0xbffff3b8 "a.com", '.' <repeats 195 times>..., query_type=1,
ip=0xbffff354 "3.3.3.3") at my_dns.c:179

3 0x080489a1 in main (argc=774778414, argv=0xbffff4d4) at my_dns.c:106

(gdb) frame 1

1 0x080493f4 in ChangetoDnsNameFormat (dns=0xbffef313 "",
host=0xbffff3b8 "a.com", '.' <repeats 195 times>...) at my_dns.c:378
378 strcat((char*)host,".");

(gdb) print host

6 = (unsigned char *) 0xbffff3b8 "a.com", '.' <repeats 195 times>...

有什么建议吗?

这是我调用 strcat 的函数

void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host) 
{
int lock = 0 , i;
strcat((char*)host,".");

for(i = 0 ; i < strlen((char*)host) ; i++)
{
if(host[i]=='.')
{
*dns++ = i-lock;
for(;lock<i;lock++)
{
*dns++=host[lock];
}
lock++; //or lock=i+1;
}
}
*dns++='\0';
}

该函数被成功调用超过1000次。

最佳答案

char * strcat ( char * destination, const char * source );

当您调用strcat时,source将被附加到destination字符串(destination的终止空字符) code> 将被 source 的第一个字符替换,依此类推)。 目标必须有足够的分配空间来包含连接的字符串。另请注意,sourcedestination 都必须是以 null 结尾的字符串

关于您的代码

void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host) {
strcat((char*)host,".")

由于您使用参数 host 来存储连接的字符串,因此在调用 ChangetoDnsNameFormat 之前必须确保 hostnull-terminated string并包含足够的分配内存来存储额外的 ..

请记住,strcat((char*)host,".") 相当于:

host[strlen((char*)host)] = '.';
host[strlen((char*)host)+1] = '\0';

这使得需要一个足够大的、以 null 结尾的字符串非常明确。

您的回溯表明您要么调用ChangetoDnsNameFormat,而没有分配尾随点所需的空间,要么您缺少host<中的终止空字符dns

写入未分配的内存位置是 undefined behavior所以它可能会也可能不会立即崩溃。如果它运行 1000 次并在第 1001 次导致段错误,这并不奇怪

关于c - strcat 在循环中导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16294216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com