【发布时间】:2020-10-14 22:03:21
【问题描述】:
我正在尝试基于如下变量创建一个字符串数组。
char* stringArray[3];
for(int i = 0; i < 3; i++) {
sprintf(stringArray[i], "string%d", i);
}
这将创建以下数组 ["string0", "string1", "string2"]。 但是,这似乎无效并给我一个内存错误。在 C 中实现此目的的正确方法是什么?
【问题讨论】:
我正在尝试基于如下变量创建一个字符串数组。
char* stringArray[3];
for(int i = 0; i < 3; i++) {
sprintf(stringArray[i], "string%d", i);
}
这将创建以下数组 ["string0", "string1", "string2"]。 但是,这似乎无效并给我一个内存错误。在 C 中实现此目的的正确方法是什么?
【问题讨论】:
您已经创建了指针,但没有存储内容。
任一字符
stringArray[3][100]; // 99 chars +1 null
或
for(int i = 0; i < 3; i++) {
stringArray[i]=malloc(100); // create memory
sprintf(stringArray[i], "string%d", i);
}
【讨论】:
你已经为三个指针分配了内存,但是你还没有分配内存来存储每个字符串。每个stringArray[i] 都需要指向一个足够大的缓冲区来存储最终的字符串。这在 C 中不会自动发生,您必须确保已分配内存来存储字符串本身。
对于这样的事情,你已经知道字符串的数量和每个字符串的最大长度,你只需要分配一个char的二维数组:
char stringArray[3][8]; // "string" plus 1 digit plus string terminator
for ( int i = 0; i < 3; i++ )
sprintf( stringArray[i], "string%d", i );
对于事先不知道每个字符串的长度的情况,您需要像现在一样分配指针数组,然后在知道每个字符串的长度后进行单独的动态分配:
char *stringArray[3];
for ( int i = 0; i < 3; i++ )
{
stringArray[i] = malloc( length_of_this_string() );
if ( stringArray[i] )
strcpy( stringArray[i], this_string );
}
【讨论】:
在C语言中,你需要为字符串分配空间。
char* stringArray[3]; 不提供指向动态大小字符串的指针。它提供了一个指向无处的字符串指针数组。使用malloc() 分配您的数组。 This answer 与您的要求接近,它解释了为字符串分配空间。
【讨论】:
您需要分配空间,并且要确保分配正确的空间量。请注意,一旦您的字符串长度超过预定值 100,接受的答案就容易溢出。动态计算事情并不难,最好的做法是避免静态大小的缓冲区(大部分时间)。例如:
#include <stdio.h>
#include <stdlib.h>
void *
xmalloc(size_t s)
{
void *rv = malloc(s);
if( rv == NULL ) {
perror("malloc");
exit(EXIT_FAILURE);
}
return rv;
}
int
main(void)
{
char* stringArray[3];
for( int i = 0; i < 3; i++ ) {
char b;
int len = snprintf(&b, 1, "string%d", i) + 1;
stringArray[i] = xmalloc(len * sizeof *stringArray[i]);
snprintf(stringArray[i], len, "string%d", i);
}
for( int i = 0; i < 3; i++ ) {
printf( "%s\n", stringArray[i]);
}
return 0;
}
【讨论】:
sizeof(char)(或只有 1 个),所以这个错误对我们有利。我试图证明x = xmalloc(n * sizeof *x) 成语并可怕地失败了。我会编辑。