在同一变量的初始化中使用变量
using variable in initialization of same variable
我在编码时被这个小东西摔倒了:
char* strinit(char* str) {
str = (char*) malloc(100);
strcpy(str, "hello SO");
return str;
}
int main()
{
char* str = strinit(str);
return 0;
}
如您所见,我正在使用我声明的同一个变量来初始化它。这没问题。我在 Java 中尝试了同样的事情。这会导致错误。
所以我的问题是:这样做有什么问题吗?我可以凭良心在我的代码中使用它吗?
不是所有你能做的都应该做。代码
char* strinit(char* str) {
str = (char*) malloc(100);
strcpy(str, "hello SO");
return str;
}
仅将参数用作局部变量。你应该把它改成
char* strinit(void) {
char* str = malloc(100);
strcpy(str, "hello SO");
return str;
}
并调用不带参数的函数。
编辑:
您的函数的实际调用只有一点点问题。 main
函数中变量str
的值传递给了strinit
函数。这对你来说很便宜。但如果参数类型是更复杂的类型,这可能会很昂贵。编译器将创建可以调用对象构造函数的参数的副本。当然,指针的拷贝是廉价的。
C & C++认为char* str = strinit(str);
是合法的;因为它被评估为:
char* str;
str = strinit(str);
参见 Why is 'int i = i;' legal?
我在编码时被这个小东西摔倒了:
char* strinit(char* str) {
str = (char*) malloc(100);
strcpy(str, "hello SO");
return str;
}
int main()
{
char* str = strinit(str);
return 0;
}
如您所见,我正在使用我声明的同一个变量来初始化它。这没问题。我在 Java 中尝试了同样的事情。这会导致错误。
所以我的问题是:这样做有什么问题吗?我可以凭良心在我的代码中使用它吗?
不是所有你能做的都应该做。代码
char* strinit(char* str) {
str = (char*) malloc(100);
strcpy(str, "hello SO");
return str;
}
仅将参数用作局部变量。你应该把它改成
char* strinit(void) {
char* str = malloc(100);
strcpy(str, "hello SO");
return str;
}
并调用不带参数的函数。
编辑:
您的函数的实际调用只有一点点问题。 main
函数中变量str
的值传递给了strinit
函数。这对你来说很便宜。但如果参数类型是更复杂的类型,这可能会很昂贵。编译器将创建可以调用对象构造函数的参数的副本。当然,指针的拷贝是廉价的。
C & C++认为char* str = strinit(str);
是合法的;因为它被评估为:
char* str;
str = strinit(str);
参见 Why is 'int i = i;' legal?