2013-06-29 63 views
0

即时尝试将常量字符数组复制到内存中的某个位置并指向它。指针,malloc和char中的C

可以说IM定义主PROG根据本VAR:

char *p = NULL; 

,并与一个字符串发送到函数:

myFunc(&p, "Hello"); 

现在我想,在这个函数结束时指针将指向字母H,但如果我放()它,它会打印你好。

这里就是我试图做的:

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; 
} 

我现在知道它的垃圾,但我想知道如何做是正确的,我的想法是分配所需的存储,复制一个char并与指针等前进。

另外我试图使参数由参考(如& PTR),但没有成功,由于左值和右值的问题。

唯一可以改变的是函数,我不想使用字符串,但字符,因为这是和运动。

感谢您提前提供任何帮助。

+0

你为什么试图在C++中使用C内存管理? –

+0

多数民众赞成在我想要做到这一点(不使用新的命令),实际上练习是在C,但我只有在我的电脑上的Visual C++。 – user2534078

+1

然后你应该标记你的问题'C',否则你会得到'C++'答案。 – juanchopanza

回答

3

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

一些更多的注意事项:

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

最后,指针确实指向'H',它只是字符串的第一个元素。输出*p而不是p来看看这个。根据需要除

*ptr[i]=strng[i]; 

应该是

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

没有括号

1

您的代码的工作,它的作用就像`*(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. 
+1

也建议检查NULL的malloc结果,因为它是很好的编程习惯。 – chux

+0

非常感谢!你能澄清*(ptr [i])和(* ptr)[i]之间的区别吗?第一个是内存指针的值,但是+我前进,后者是? – user2534078

+0

@ user2534078'(* ptr)[i]'是一个指向i元素数组的指针。 – 0decimal0

0

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

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

}

这里唯一的问题是,“你好”驻留在只读部分,因为它是一个常量字符串...所以你不能“你好”变成别的东西......