终止指针指针?

时间:2011-04-06 10:01:13

标签: c

我没有得到编译器警告,但它是段错误。那么如何在字符串的开头复制'\ 0',以便我可以使用strncat? (不允许使用strncpy并使用memcpy然后终止字符串段错误。)

我写这篇文章来说明问题:

void func(char **str)
{
    *str = realloc(*str, -);
    *str[0] = '\0'; // I get segfault here.
    strncat(*str, -, -);

    // memcpy(*str, -, -);
    // *str[strlen(*str)] = '\0'; // I get segfault here.
}

int main(void)
{
    char *str = NULL;
    func(&str);
    return 0;
}

编辑:我的意思是写strlen(* str)而不是strlen(str)。遗憾。

2 个答案:

答案 0 :(得分:3)

第二个segfaulting行的问题是运算符优先级。

[]的优先级高于*,因此*str[strlen(*str)]被解释为*(str[strlen(*str)]) - 也就是说,取消引用str + strlen(*str)处内存指向的地址。

您想要(*str)[strlen(*str)] - 也就是str末尾的字符 - 取消引用。

答案 1 :(得分:0)

当程序访问的内存无效时,会发生分段错误。重新分配调用很可能无法分配所请求的内存量。在继续访问内存之前,最好先检查内存是否已正确分配。

我尝试过这个程序,在我的系统中运行良好。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

    void func(char **str)
    {
        *str = realloc(*str, sizeof(char) * 20);
        if( *str == NULL)
        {
            printf("Memory allocation failed\n");
            return;
        }

        *str[0] = '\0';
        strncat(*str, "hello world", 11);  
        //memcpy(*str, "hello world", 11); //memcpy also works fine
        //(*str) [strlen(*str)] = '\0';   
        printf("String : %s\n", *str);
     }