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()
或原始指针
还有一些注意事项:
as参数与const char strng[]
相同。数组语法并没有使它成为数组,它仍然是一个指针。为了避免这种混淆,我不使用这种语法const char*strng
- 检查
的返回值,它可以返回null。另外,最终必须调用malloc()
,否则应用程序会泄漏内存free()
最后,指针确实指向“H”,它只是字符串的第一个元素。输出
*p
而不是p
以查看此信息。只需将所有char*
替换为std::string
。这样做,直到你有一个非常具体的理由不使用现有的实用程序,这是你作为一个初学者所没有的。上面的代码都不需要malloc()
或原始指针
还有一些注意事项:
as参数与const char strng[]
相同。数组语法并没有使它成为数组,它仍然是一个指针。为了避免这种混淆,我不使用这种语法const char*strng
- 检查
的返回值,它可以返回null。另外,最终必须调用malloc()
,否则应用程序会泄漏内存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]