在什么情况下(如果有的话)strcat()挂起?

时间:2015-05-13 21:55:55

标签: c string pointers hang strcat

我在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;

4 个答案:

答案 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* rootchar *,但它确实指向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;