我在C函数中有这段代码:
char* root = "/home/OS/homework/user/honorsupgrade/HTML";
requestInfo->resource = "/bing"
printf("1\n");
int counter = 0;
for(counter = 0; counter < 100; counter++)
{
if(root[counter] == '\0')
{
printf("True1\n");
break;
}
}
for(counter = 0; counter < 100; counter++)
{
if(requestInfo->resource[counter] == '\0')
{
printf("True2\n");
break;
}
}
printf("2\n");
fflush(stdout);
strcat(root, requestInfo->resource);
printf("3\n");
fflush(stdout);
return open(root, 0_RDONLY);
...
根据需要请求信息
struct ReqInfo
{
char *resource;
}
我在C中创建了两个字符串(字符指针),但由于某种原因,当我将这些方法传递给strcat()时,strcat()永远不会返回。这会导致程序挂起。我已经测试过以确保两个字符串都有空终止符(因此strcat不会尝试连接多于它应该的连接)。该程序将打印1和2,但从不打印3,这意味着它永远不会通过strcat()调用,因为我正在刷新缓冲区以确保那里没有问题。 \
编辑:我已经在这段代码之外创建了结构,我在更换&#34; requestInfo-&gt; resource&#34;时遇到了同样的问题。使用char *资源并使其成为&#34; / bing&#34;答案 0 :(得分:2)
调用未定义的行为原则上可能导致任何问题,包括挂起您的程序。将指针传递给字符串文字作为strcat
的目标时,可以调用未定义的行为。
// root points to a string literal. This is immutable!
char* root = "/home/OS/homework/user/honorsupgrade/HTML";
....
// Oops! Writing to *root is undefined behaviour!
strcat(root, requestInfo->resource);
答案 1 :(得分:1)
您正在尝试修改常量字符串。声明
char* root = "/home/OS/homework/user/honorsupgrade/HTML";
设置root
指针指向包含路径的常量字符串。 root
指向的内存不得修改,并且这样做会调用未定义的行为。对strcat()
的调用尝试修改超过常量字符串数据末尾的数据。这听起来像编译器在那里放了一些重要的东西,并且你覆盖了它。
答案 2 :(得分:1)
尝试写入const char *
尽管char* root
是char *
,但它确实指向const char *
。写到那是不确定的行为。
char* root = "/home/OS/homework/user/honorsupgrade/HTML";
....
strcat(root, requestInfo->resource);
代码应该分配一个正确大小的工作缓冲区。
char buffer[1000];
strcpy(buffer, root);
strcat(buffer, requestInfo->resource);
答案 3 :(得分:0)
在C语言中,程序员控制并负责内存分配。
您提供的代码将具有未定义的行为,因为您要求&#34; strcat&#34; (请参阅&#34; man strcat&#34;)将某些内容复制到一个未保留的位置(内存的末尾由&#39; root&#39;指向的字符串占用。)
很难说你真正想做什么,但为了避免崩溃你应该:
char[<static_buffer_lenght>] root = ...
...
strncat(root, <something>, sizeof(root) - strlen(root) - 1)
这将使您的程序稍大,或者:
char *root = (char *)malloc(<size_of_dynamic_buffer>)
bzero((void *)root, <size_of_dynamic_buffer>)
if (!root) { <handle memory error here> }
...
strncat(root, <something>, <size_of_dynamic_buffer> - strlen(root) - 1)
会使你的程序稍慢一些
没有使用&#39; C&#39;有一段时间了,所以有些细节可能会导致编辑警告(当然,你必须用正确的文本替换,以及#39;