char *参数值在函数内部更改

问题描述 投票:0回答:2

我想创建一个程序,该程序创建一个2D数组并从stdin中填充它,以备后用。最初,我对其进行了设计,以使函数takeInput()接受用户的输入并返回包含所有一位整数的单个字符串的char *。然后,我的目的是获取此char *并将其作为参数传递给第二个函数createArray(),该函数将相应地填充数组。

当我的参数char *的值开始在第二个函数内更改(丢失值)时,就会发生此问题。

注:我已经在第一个函数内使用malloc为char *分配了内存,目的是不要将其值设为函数的局部值。

我的主要表情如下:

#include <stdio.h>
#include "functions.h"

int main(int argc, const char * argv[]) {

    const char *string = takeInput();
    int **initState = createArray(3, 3, string);

    return 0;
}

这是第一个功能:

const char* takeInput() {
    char string2[10];
    /* some code */
    char *string0 = malloc(sizeof(string2));
    string0 = string2;
    return string0;
}

这是第二个功能:

int **createArray(int rows, int columns, const char *string) {
    int **array;
    int traverse = 0;
    // allocating memory for number of rows
    array = malloc(rows * sizeof(int*));

    // allocating memory for number of columns
    for(int i = 0 ; i < rows ; i++) {
        array[i] = malloc(columns * sizeof(int));
    }

    // populating indices in 2D array with values from string
    for(int i = 0 ; i < rows ; i++) {

        for(int j = 0 ; j < columns ; j++) {

            // converting chars to digits or the '_' char 
            if (string[traverse] != 95) {
                array[i][j] = (string[traverse] - 48);
            }

            else {
                array[i][j] = 48;
            }
            traverse++;
        }
    }
    return array;
}

const char *string的值在我的代码到达第一个for循环后立即更改,并在其余代码中减小。任何想法/建议都将不胜感激!

c pointers memory heap
2个回答
0
投票

程序具有未定义的行为,因为在此功能中

const char* takeInput() {
    char string2[10];
    /* some code */
    char *string0 = malloc(sizeof(string2));
    string0 = string2;
    return string0;
}

指向本地数组的指针

    string0 = string2;
    return string0;

返回。此外,该函数还会发生内存泄漏,因为已分配内存,并且其地址已分配给指针string0,然后重新分配了指针。

如果数组string2包含一个字符串,则可以使用标准的C函数strcpy之类的方式>>

strcpy( string0, string2 );

0
投票

您返回一个局部变量的地址,一旦函数返回,它的生命周期将结束。之后访问该地址将产生不确定的行为。

© www.soinside.com 2019 - 2024. All rights reserved.