在函数之间传递char指针 - 两种方式是否相等? - C

时间:2018-04-08 13:12:57

标签: c pointers char

我已经完成了一个将char指针传递给其他函数的MCVE代码。如果传递char指针参数的两种方式相同(str1str2如何传递到passingCharPointer1passingCharPointer2,我有这个家伙)。

此外,我在代码中包含注释,其中包含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;
}

2 个答案:

答案 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允许你修改传递给函数的指针。