0
struct integer
{
    int len;
    char* str;
    int* arr;
}int1, int2;


int main(void) {
    printf("Please enter 1st number\n");
    int1.str= str_input();
    int1.len=chars_read-1;
    int1.arr= func2(int1.len, int1.str);
    printf(("\%c\n"), *int1.str);
    printf("Please enter 2nd number\n");
    int2.str = str_input();
    int2.len=chars_read-1;
    printf(("\n %c\n"), *int1.str );
    int2.arr= func2(int2.len, int2.str);

如果输入为 4363 和 78596 ,则输出分别为 4 和 7。

输出不是 4 和 4。鉴于两者都是不同的对象,不应该都有不同的内存分配吗?

请注意:这不是印刷错误。我两次都使用了相同的 *int1.str。问题是,虽然我没有对它做任何改变,但它的价值却在改变。如何?我不认为 str_input() 可以有所作为。

char* str_input(void) {
char cur_char;
char* input_ptr = (char*)malloc(LINE_LEN * sizeof(char));
char input_string[LINE_LEN];
//while ((cur_char = getchar()) != '\n' && cur_char<='9' && cur_char>='0' && chars_read < 10000)
for(chars_read=1; chars_read<10000; chars_read++)
{
    scanf("%c", &cur_char);
    if(cur_char!='\n' && cur_char<='9' && cur_char>='0')
    {
        input_string[chars_read-1]= cur_char;
        printf("%c\n", input_string[chars_read-1]);
    }
    else{
            break;
    }
}
input_string[chars_read] = '\n';
input_ptr = &input_string[0]; /* sets pointer to address of 0th index */
return input_ptr;
}

//chars_read is a global variable.

提前致谢。

4

2 回答 2

2

如其他地方所述printf,您问题中的两个调用都传递*int1.strprintf.

但是,如果这仅仅是您的问题中的一个印刷错误,并且第二次printf调用通过了*int2.str,那么问题很可能是str_input返回固定缓冲区的地址(具有静态或更糟糕的自动存储持续时间)。相反,str_input应该使用mallocorstrdup为每个字符串分配新内存并返回一个指向它的指针。然后调用者应该释放内存。

或者,str_input可以更改为接受调用者传递给它的缓冲区和大小,并且调用者将负责为每个调用提供不同的缓冲区。

关于新发布的代码

的代码str_input包含这一行:

char* input_ptr = (char*)malloc(LINE_LEN * sizeof(char));

声明input_ptr为 achar *并要求malloc获得空间。然后input_ptr设置为包含该空间的地址。后来,str_input包含这一行:

input_ptr = &input_string[0];

该行完全忽略 的先前值input_ptr并用 的地址覆盖它input_string[0]。所以返回的地址malloc就没有了。该str_input函数返回input_string[0]每次调用的地址。这是错误的。每次都str_input 必须返回分配空间的地址。

通常,像这样的例程将始终使用,在该地址的数组中完成input_ptr其工作。char它不会使用单独的数组 ,input_string来完成它的工作。因此删除 的定义input_string并更改str_input以在 指向的空间中完成所有工作input_ptr

此外,不要将缓冲区的大小设置为LINE_LEN一个位置,而是用 . 限制其中的字符数chars_read < 10000。在所有地方使用相同的限制。最后还允许一个字节作为空字符(除非您非常小心,不要执行任何需要在末尾有空字节的操作)。

于 2013-08-10T19:04:28.540 回答
2

您打印了相同的变量,*int1.str

有源代码会很有帮助str_input(),但它可能会在每次调用中返回一个指向同一个缓冲区的指针,所以第二次调用也str_input()更新了目标int1.str(因为它指向的是相同char*int2.str

于 2013-08-10T18:58:19.207 回答