C中的指针、malloc和char

C中的指针、malloc和char,c,pointers,char,cstring,C,Pointers,Char,Cstring,我正试图将一个常量字符数组复制到内存中的某个位置并指向它 假设我在主程序下定义此变量: char *p = NULL; 并使用字符串将其发送到函数: myFunc(&p, "Hello"); 现在我想在这个函数的末尾,指针会指向字母H,但是如果我把它放在()上,它会打印Hello 以下是我试图做的: void myFunc(char** ptr , const char strng[] ) { *ptr=(char *) malloc(sizeof(strng));

我正试图将一个常量字符数组复制到内存中的某个位置并指向它

假设我在主程序下定义此变量:

char *p = NULL;
并使用字符串将其发送到函数:

myFunc(&p, "Hello");
现在我想在这个函数的末尾,指针会指向字母H,但是如果我把它放在()上,它会打印Hello

以下是我试图做的:

void myFunc(char** ptr , const char strng[] ) {
    *ptr=(char *) malloc(sizeof(strng));    
    char * tmp=*ptr;
    int i=0;
    while (1) {
        *ptr[i]=strng[i];
        if (strng[i]=='\0') break;
        i++;
    }
    *ptr=tmp;
}
我现在知道这是一个垃圾,但我想知道如何做它的权利,我的想法是分配所需的内存,复制一个字符和前进的指针,等等

此外,我还尝试使用referenec(like&ptr)进行ptr参数,但由于左值和右值的问题,没有成功

对我来说唯一可以改变的是函数,我不想使用字符串,而是像这样使用字符和练习


提前谢谢你的帮助

只要用
std::string
替换所有的
char*
。这样做,直到你有一个非常具体的理由不使用现有的实用程序,这是你作为一个初学者所没有的。上面的代码都不需要
malloc()
或原始指针

还有一些注意事项:

  • const char strng[]
    as参数与
    const char*strng
    相同。数组语法并没有使它成为数组,它仍然是一个指针。为了避免这种混淆,我不使用这种语法
  • 使用<代码> STATICORCAST 或其他C++的一种类型,而不是C风格,如<代码>(char)Malc(..)< />代码。原因是它们更安全
  • 检查
    malloc()
    的返回值,它可以返回null。另外,最终必须调用
    free()
    ,否则应用程序会泄漏内存

最后,指针确实指向“H”,它只是字符串的第一个元素。输出
*p
而不是
p
以查看此信息。

只需将所有
char*
替换为
std::string
。这样做,直到你有一个非常具体的理由不使用现有的实用程序,这是你作为一个初学者所没有的。上面的代码都不需要
malloc()
或原始指针

还有一些注意事项:

  • const char strng[]
    as参数与
    const char*strng
    相同。数组语法并没有使它成为数组,它仍然是一个指针。为了避免这种混淆,我不使用这种语法
  • 使用<代码> STATICORCAST 或其他C++的一种类型,而不是C风格,如<代码>(char)Malc(..)< />代码。原因是它们更安全
  • 检查
    malloc()
    的返回值,它可以返回null。另外,最终必须调用
    free()
    ,否则应用程序会泄漏内存

最后,指针确实指向“H”,它只是字符串的第一个元素。输出
*p
而不是
p
以查看此信息。

您的代码可以按需要工作,除了

    *ptr[i]=strng[i];
应该是

    (*ptr)[i]=strng[i];
如果没有paren,它的行为就像`*(ptr[i])=strng[i]

2) 也

s/b

您可能需要查看
strdup(strng)


[根据OP的请求进行编辑]

(*ptr)[i]
之间的差异

// OP desired function
(*ptr)[i] = 'x';
// Dereference ptr, getting the address of a char *array.
// Assign 'x' to the i'th element of that char * array.

// OP post with the undesired function
*(ptr[i]) = 'x';
//  This is like
char *q = ptr[i];
*q = 'x';
// This make sense _if_ ptr were an array of char *.  
// Get the i'th char * from ptr and assign to q.  
// Assign 'x' to to the location pointer to by q.

您可以根据需要编写代码,除了

    *ptr[i]=strng[i];
应该是

    (*ptr)[i]=strng[i];
如果没有paren,它的行为就像`*(ptr[i])=strng[i]

2) 也

s/b

您可能需要查看
strdup(strng)


[根据OP的请求进行编辑]

(*ptr)[i]
之间的差异

// OP desired function
(*ptr)[i] = 'x';
// Dereference ptr, getting the address of a char *array.
// Assign 'x' to the i'th element of that char * array.

// OP post with the undesired function
*(ptr[i]) = 'x';
//  This is like
char *q = ptr[i];
*q = 'x';
// This make sense _if_ ptr were an array of char *.  
// Get the i'th char * from ptr and assign to q.  
// Assign 'x' to to the location pointer to by q.

这是所有需要的代码。。。 没别的了

void myFunc(char **pp, char * str){
*pp = str;
}


这里唯一的问题是“Hello”位于只读部分,因为它是一个常量字符串。。。因此,您不能将“Hello”更改为其他内容……

这就是所需的全部代码。。。 没别的了

void myFunc(char **pp, char * str){
*pp = str;
}


这里唯一的问题是“Hello”位于只读部分,因为它是一个常量字符串。。。所以你不能改变“hello”到其他东西……/p>为什么你尝试在C++中使用C内存管理?这就是我想要做的方式(不使用新命令),实际上这个练习是在C中,但是我的PC上只有Visual C++。然后你应该把你的问题标记为代码>代码<代码>。否则,你将得到<代码> C++< /Cord>回答。VisualC++也会编译C代码——只给你的源文件A.C后缀代替.CPP,它将被编译成C.thanks的注释,将标签改成C和文件扩展。为什么你要用C++ C++内存管理?这就是我想做的方式。(不使用新命令)实际上,练习是在C上,但是我的PC上只有Visual C++。然后你应该把你的问题标记为代码>代码>代码>,否则你将得到<代码> C++ +/>代码>答案。VisualC++将编译C代码——只给你的源文件A. C后缀而不是.CPP,它将被编译成C.thanks的注释,将标签改成C和文件。扩展。还建议检查malloc结果是否为NULL,因为这是一个很好的编程实践。非常感谢!!!您能澄清*(ptr[i])和(*ptr)[i]之间的区别吗?第一个是指向的内存指针的值,但+i向前放置,后者是?@user2534078
(*ptr)[i]
是一个指向i元素数组的指针……但仅在声明中,PHIfounder。在这种情况下,它首先计算表达式
*ptr
,然后将
[i]
应用到它。因为
*ptr
相当于
ptr[0]
,所以这里就得到了ptr[0][i]。要理解这一点,请记住
ptr
指向二维数组,尽管在第一维中只有一个元素,即
char*
指针。还建议检查malloc结果是否为NULL,因为这是一种很好的编程实践。非常感谢!!!您能澄清*(ptr[i])和(*ptr)[i]之间的区别吗第一个是指向but+i的内存指针的值,后者是@user2534078
(*ptr)[i]