如何将指针和指针传递给函数?

时间:2010-11-10 20:12:32

标签: c++

我实现了一个像getline(..)一样的函数。所以我最初的方法是:

#include <cstdio>
#include <cstdlib>
#include <cstring>

void getstr( char*& str, unsigned len ) {
    char c;
    size_t i = 0;
    while( true ) {
        c = getchar(); // get a character from keyboard
        if( '\n' == c || EOF == c ) { // if encountering 'enter' or 'eof'
            *( str + i ) = '\0'; // put the null terminate
            break; // end while
        }
        *( str + i ) = c;
        if( i == len - 1 ) { // buffer full 
            len = len + len; // double the len 
            str = ( char* )realloc( str, len ); // reallocate memory
        }
        ++i;
    }
}

int main() {
    const unsigned DEFAULT_SIZE = 4;
    char* str = ( char* )malloc( DEFAULT_SIZE * sizeof( char ) );
    getstr( str, DEFAULT_SIZE );
    printf( str );
    free( str );
    return 0;
}

然后,我认为我应该切换到纯C而不是使用半个C / C ++。所以我改变了char *&amp;到char **: 指针版指针(crahsed)

#include <cstdio>
#include <cstdlib>
#include <cstring>

void getstr( char** str, unsigned len ) {
    char c;
    size_t i = 0;
    while( true ) {
        c = getchar(); // get a character from keyboard
        if( '\n' == c || EOF == c ) { // if encountering 'enter' or 'eof'
            *( *str + i ) = '\0'; // put the null terminate
            break; // done input end while
        }
        *( *str + i ) = c;
        if( i == len - 1 ) { // buffer full 
            len = len + len; // double the len 
            *str = ( char* )realloc( str, len ); // reallocate memory
        }
        ++i;
    }
}

int main() {
    const unsigned DEFAULT_SIZE = 4;
    char* str = ( char* )malloc( DEFAULT_SIZE * sizeof( char ) );
    getstr( &str, DEFAULT_SIZE );
    printf( str );
    free( str );
    return 0;
} 

但是这个版本崩溃了,(访问冲突)。我试过运行调试器,但我找不到它崩溃的地方。我正在运行Visual Studio 2010,所以你们能告诉我如何修复它吗?

我遇到的另一个奇怪的事情是,如果我离开“&amp;” out,它只适用于Visual Studio,但不适用于g ++。那是

void getstr( char* str, unsigned len ) 

根据我的理解,每当我们使用指针来分配或释放一块内存时,我们实际上会修改指针所指向的位置。所以我认为我们必须使用**或*&amp;修改指针。但是,因为它在Visual Studio中运行正常,它只是运气还是应该没问题?

3 个答案:

答案 0 :(得分:5)

  

然后,我认为我应该切换到纯C而不是使用一半的C / C ++。

我建议另一个方向。去全面的C ++。

答案 1 :(得分:4)

您的指针崩溃可能在realloc

*str = ( char* )realloc( str, len )

应该是

*str = ( char* )realloc( *str, len )

史蒂夫指出,如果realloc失败,你的代码会漏掉原来的内容,所以可能会把它更改为:

char* tmp = (char*) realloc(*str, len)
if (tmp) {
    *str = tmp
} else {
    // realloc failed.. sigh
} 

答案 2 :(得分:0)

好吧,在调试器中运行它会突出显示这一行

        *str = ( char* )realloc( str, len ); // reallocate memory

str - 指向变量的指针 - 和*str - 指向内存的指针之间不匹配。

我很想重写它所以它返回字符串,或者在出错时返回零,而不是有一个void返回和一个输入/输出参数(就像fgets一样,这似乎是你排序的函数 - 复制行为)。或者包装这样的功能。这种风格不会让你感到困惑,因为你只处理指向char的指针,而不是指向char的指针。

    char* getstr_impl ( char* str, unsigned len ) {...}

    void getstr( char** str, unsigned len ) {
        *str = getstr_impl ( *str, len );
    }
相关问题