0

我试图将一个 const char 数组复制到内存中的某个位置并指向它。

假设我在主编下定义了这个变量:

char *p = NULL;

并将其发送到带有字符串的函数:

myFunc(&p, "Hello");

现在我希望在这个函数的末尾指针指向字母 H 但如果我 puts() 它,它将打印 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(如&ptr)制作ptr参数,但由于 lvalue 和 rvalue 的问题而没有成功。

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

提前感谢您的帮助。

4

3 回答 3

3

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

还有一些注意事项:

  • const char strng[]as 参数与const char* strng. 数组语法不会使它成为一个数组,它仍然是一个指针。为了避免这种混淆,我不使用这种语法。
  • 使用static_cast或其他 C++ 转换之一,而不是 C 风格,如(char*)malloc(..). 原因是它们更安全。
  • 检查 的返回值malloc(),它可以返回 null。此外,您必须free()最终调用,否则您的应用程序会泄漏内存。

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

于 2013-06-29T07:15:42.050 回答
1

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

    *ptr[i]=strng[i];

应该

    (*ptr)[i]=strng[i];

没有括号,它的行为类似于 `*(ptr[i])=strng[i];

2) 还有

malloc(sizeof(strng));

s/b

malloc(strlen(strng)+1);

你可能想看看strdup(strng)


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

*(ptr[i])和之间的区别(*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.
于 2013-06-29T08:59:54.967 回答
0

这就是所有需要的代码......仅此而已......

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

}

这里唯一的问题是“Hello”位于只读部分,因为它是一个常量字符串......所以你不能将“Hello”更改为其他东西......

于 2013-06-29T10:47:19.733 回答