C 终止指向指针的指针?

C 终止指向指针的指针?,c,C,我没有从中得到编译器警告,但它有错误。那么,如何在字符串开头复制“\0”,以便使用strncat呢?(不允许使用strncpy,也不允许使用memcpy然后终止字符串。) 我写这篇文章是为了说明这个问题: void func(char **str) { *str = realloc(*str, -); *str[0] = '\0'; // I get segfault here. strncat(*str, -, -); // memcpy(*str, -, -

我没有从中得到编译器警告,但它有错误。那么,如何在字符串开头复制“\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)。抱歉。

第二条分段故障线的问题是运算符优先级

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


您需要取消引用
(*str)[strlen(*str)]
-即
str
末尾的字符。

第二个分段错误行的问题是运算符优先级

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


您需要取消引用
(*str)[strlen(*str)]
-即
str
末尾的字符。

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

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

#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);
     }
#包括
#包括
#包括
无效函数(字符**str)
{
*str=realloc(*str,sizeof(char)*20);
如果(*str==NULL)
{
printf(“内存分配失败\n”);
返回;
}
*str[0]='\0';
strncat(*str,“你好,世界”,11);
//memcpy(*str,“hello world”,11);//memcpy也可以正常工作
//(*str)[strlen(*str)]='\0';
printf(“字符串:%s\n”,*str);
}

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

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

#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);
     }
#包括
#包括
#包括
无效函数(字符**str)
{
*str=realloc(*str,sizeof(char)*20);
如果(*str==NULL)
{
printf(“内存分配失败\n”);
返回;
}
*str[0]='\0';
strncat(*str,“你好,世界”,11);
//memcpy(*str,“hello world”,11);//memcpy也可以正常工作
//(*str)[strlen(*str)]='\0';
printf(“字符串:%s\n”,*str);
}


这是一个
C
问题,而不是
C++
问题;看起来并不特别合法——是否有输入错误?我认为OP可能只是省略了不相关的参数——看看strncat和memcpy调用。因为你显然是一名C程序员,你对什么是或不是不相关没有很好的判断。发布你运行的代码。@Jim:我会更进一步——不管你是新手还是新手,如果你不知道代码出了什么问题,那么你就不能很好地判断什么是相关的。将演示问题的测试用例减少到最少,一半时间就能解决问题,就像向玩具玩具解释问题一样。这是一个
C
问题,而不是
C++
问题。realloc(*str,-);看起来并不特别合法——是否有输入错误?我认为OP可能只是省略了不相关的参数——看看strncat和memcpy调用。因为你显然是一名C程序员,你对什么是或不是不相关没有很好的判断。发布你运行的代码。@Jim:我会更进一步——不管你是新手还是新手,如果你不知道代码出了什么问题,那么你就不能很好地判断什么是相关的。把演示问题的测试用例减少到最少,一半的时间就能解决问题,这就像向一个填充玩具解释你的问题一样。天啊,别这么胡说八道。问题是运算符优先级,OP确实需要
(*str)[0]
——或
**str
。您是正确的,尽管对于
*str[0]
来说,这几乎是不相关的,因为
*str[0]
定义为
**(str+0)=**str。但是,
*str[strlen(str)]
是绑定到segfault的。我很确定**str-str[0][0]*str[0]和(*str)[0]的计算结果都是一样的——字符串的第一个字符。是的,这就是我犹豫的原因。事实上,指示的第一行没有失败。你是对的,我应该检查一下。然而,由于我的答案对于第二个segfault是正确的(如果realloc成功,第一个可疑代码行就可以了),我将简单地编辑我的答案,以反映它适用于什么。天哪,不要这么草率。问题是运算符优先级,OP确实需要
(*str)[0]
——或
**str
。您是正确的,尽管对于
*str[0]
来说,这几乎是不相关的,因为
*str[0]
定义为
**(str+0)=**str。但是,
*str[strlen(str)]
是绑定到segfault的。我很确定**str-str[0][0]*str[0]和(*str)[0]的计算结果都是一样的——字符串的第一个字符。是的,这就是我犹豫的原因。事实上,指示的第一行没有失败。你是对的,我应该检查一下。然而,由于我对第二个segfault的回答是正确的(如果realloc成功,第一个可疑代码行就可以了),我只需将我的回答编辑为r