gpt4 book ai didi

c - 重新分配后打印字符串数组时遇到问题?

转载 作者:行者123 更新时间:2023-11-30 16:44:14 25 4
gpt4 key购买 nike

下面的代码读取字符,并在遇到分隔符时将其拆分为 C 风格的字符串,然后将单词(以空格分隔的字符序列)存储在字符串数组中,直到遇到标记为止;更新字符串数组的大小:

#include <stdio.h>      // printf()
#include <stdlib.h> // malloc(); realloc()
#include <string.h> // strcmp()
#include <stddef.h> // size_t

void print_array(char* arr[ ], size_t size); // forward declaration to use in to_array()

char* get_word(char delimiter)
{
size_t size = 8;
size_t index = 0;

int c = 0;
char* word = 0;
char* expand_word = 0;

word = (char*) malloc(sizeof(char) * size);
if (word == NULL)
{
perror("get_word::bad malloc!\n");
exit(-1);
}

while ((c = getchar()) != EOF && c != delimiter && c != '\n')
{
if (index >= size)
{
size *= 2;

expand_word = (char*) realloc(word, sizeof(char) * size);
if (expand_word == NULL)
{
perror("get_word::bad realloc!\n");
exit(-1);
}

word = expand_word;
}

word[index++] = c;
}

word[index] = 0;

return word;
}

//-------------------------------------------------------------------------------------
void to_array(char* arr[ ], size_t* size, char* sentinel)
{
size_t index = 0;
char* word = 0;
char** expand_arr = 0;
char delimiter = ' ';

while ((word = get_word(delimiter)) && strcmp(word, sentinel) != 0)
{
if (index >= (*size))
{
(*size) *= 2;

expand_arr = (char**) realloc(arr, sizeof(char*) * (*size));
if (expand_arr == NULL)
{
perror("to_array::bad realloc!\n");
exit(-1);
}

arr = expand_arr;
}

arr[index++] = word;
}

(*size) = index;

// print_array(arr, *size); // <---- here, all words printed OK.
// getchar();
}

//-------------------------------------------------------------------------------------

void print_array(char* arr[ ], size_t size)
{
size_t i = 0;

printf("{ ");
for (i; i < size; ++i)
{
printf("%s", arr[i]);

if (i < size - 1)
{
printf(", ");
}
}
printf(" }\n");
}

//-------------------------------------------------------------------------------------

int main()
{
size_t size = 4;
char** arr = 0;
char* sentinel = "quit";

arr = (char**) malloc(sizeof(char*) * size);
if (arr == NULL)
{
perror("array of strings::bad malloc!\n");
exit(-1);
}

printf("Type a sentence and get each word as an array element:\n");
to_array(arr, &size, sentinel);

printf("Words:\n");
print_array(arr, size); // <--------- here, error!

getchar();
}

当尝试打印字符串数组时,我得到:

Access violation reading location 0xcd007361.

为什么最后无法打印arr中的字符串?

<小时/>

P.S.:我猜问题出在函数 to_array() 中的指针算术和 char** arr 的重新分配。 (如果上一个正确)我不确定处理它的标准方法是什么?

最佳答案

问题:

void to_array() 中的第一个参数,即 char* arr[ ] 传递 a 的副本指向 char 数组的指针。函数内部对指针所做的每次更改都不会影响外部指向 char 数组的实际指针,特别是函数 realloc() 可能会将初始内存块移动到新位置,这将使作为第一个参数传递的指针无效。

解决方案:

要么修改函数 void to_array()以返回修改后的 arr,要么修改第一个函数的参数为​​ char** arr[ ]。选择后者,修改后的代码如下所示:

void to_array(char** arr[ ], size_t* size, char* quit)
{
size_t index = 0;
char* word = 0;
char** expand_arr = 0;
char sentinel = ' ';

while ((word = get_word(sentinel)) && strcmp(word, quit) != 0)
{
if (index >= (*size))
{
(*size) *= 2;

expand_arr = (char**) realloc((*arr), sizeof(char*) * (*size));

if (expand_arr == NULL)
{
perror("to_array::bad realloc!\n");
exit(-1);
}

(*arr) = expand_arr;
}

(*arr)[index++] = word;
}

(*size) = index;
}

那么函数调用必须如下完成:

to_array(&arr, &size, quit);

关于c - 重新分配后打印字符串数组时遇到问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44630164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com