繁体   English   中英

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

[英]Passing char pointers between functions - Are both ways equal? - C

我已经完成了一个将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;
}

通常,功能不相同。 第一个函数按值接受指针,而第二个函数通过引用接受指针。 结果,第二个函数可以将表达式中使用的原始指针更改为参数。

考虑以下示范程序

#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

在释放后访问内存时,请注意调用未定义的行为。

如果你质疑是真的:

是两种传递参数的方式相同(function1和function2)

(你忽略了main()所有代码),然后是的,这两个函数本质上是等价的。

区别在于function1接受一个指向char的指针(在C语言中,它是一个字符串的成语),而function2接受一个指向char的指针。

但正如来自莫斯科的@Vlad指出的那样,function2允许你修改传递给函数的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM