我已经完成了一个将char指针传递给其他函数的MCVE代码。如果传递char指针参数的两种方式相同(str1
和str2
如何传递到passingCharPointer1
和passingCharPointer2
,我有这个家伙)。
此外,我在代码中包含注释,其中包含free / null函数的行为及其行为(如果它们也被阅读,我将不胜感激)。
代码是:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 50
void passingCharPointer1(char *str) {
strcpy(str, "Hi-1!");
}
void passingCharPointer2(char **str) {
strcpy(*str, "Hi-2!");
}
int main() {
// Init char pointers
char *str1 = malloc((MAX_LENGTH +1)*sizeof(char));
char *str2 = malloc((MAX_LENGTH +1)*sizeof(char));
// Gets their values
printf("Input string 1: ");
fgets(str1, MAX_LENGTH , stdin);
printf("Input string 2: ");
fgets(str2, MAX_LENGTH , stdin);
printf("\n");
// Remove '\n' character
str1[strcspn(str1, "\n")] = '\0';
str2[strcspn(str2, "\n")] = '\0';
// Print their values
printf("BEFORE - Function 1: %s\n", str1);
printf("BEFORE - Function 2: %s\n", str2);
// Pass to function in two ways - ARE BOTH WAYS EQUAL?
passingCharPointer1(str1);
passingCharPointer2(&str2);
// Print their values
printf("AFTER - Function 1: %s\n", str1);
printf("AFTER - Function 2: %s\n", str2);
// Freeing pointers
free(str1);
free(str2);
// Print their values after freeing
printf("\nAFTER FREE 1: %s\n", str1); // Show rare characters (I supposse it is normal behaviour after free)
printf("AFTER FREE 2: %s\n", str2); // Continue having its content (I supposse it is not normal behaviour after free)
// Nulling pointers
str1 = NULL;
str2 = NULL;
// Print their values after nulling
printf("\nAFTER NULL 1: %s\n", str1); // Normal behaviour
printf("AFTER NULL 2: %s\n", str2); // Normal behaviour
// Exit success
return 0;
}
答案 0 :(得分:2)
通常,功能不相同。第一个函数按值接受指针,而第二个函数通过引用接受指针。因此,第二个函数可以将表达式中使用的原始指针更改为参数。
考虑以下示范程序
#include <stdio.h>
void passingCharPointer1( char *s )
{
s = "Bye";
}
void passingCharPointer2( char **s )
{
*s = "Bye";
}
int main(void)
{
char *s1 = "Hello";
char *s2 = "Hello";
printf( "Before function calls: %s %s\n", s1, s2 );
passingCharPointer1( s1 );
passingCharPointer2( &s2 );
printf( "After function calls: %s %s\n", s1, s2 );
return 0;
}
它的输出是
Before function calls: Hello Hello
After function calls: Hello Bye
在释放内存后,将访问内存加入会调用未定义的行为。
答案 1 :(得分:1)
如果你的问题是真的:
等于传递参数的两种方式(function1和function2)
(你忽略了main()
中的所有代码),然后是的,这两个函数本质上是等价的。
区别在于function1接受一个指向char的指针(在C语言中,是一个字符串的成语),而function2接受一个指向char的指针。
但是,正如来自莫斯科的@Vlad所指出的那样,function2允许你修改传递给函数的指针。