C语言中带指针的字符串数组

3

我需要帮助我的C程序,这是我学校的作业。我认为离正确很近了,但我仍然无法使结果正确地打印出来。该程序由4个.c函数文件组成。

出于某种原因,我无法正确输出程序,但我无法弄清楚原因。也许这里的某个人能发现我做错了什么。任何技巧都将不胜感激。我是编程新手。我们被给予函数和参数,并且我们必须想出内部细节。

这些函数应该使用指针和malloc进行动态分配来创建和访问字符串数组。


1:createStringArray.c 动态分配一个指向字符串的指针数组

#include <stdlib.h>

char** createStringArray(int number){
  return malloc((sizeof(char*))*number);
}

2: setStringArray.c将字符串存储在数组中,传递到函数中的字符串必须已经分配了内存,并且必须复制到空间中。对于参数:array是第一部分中分配的数组,index是要存储字符串的位置,string是要传入的字符串。

#include <stdlib.h>

void setStringArray(char** array, int index, char* string){
  array[index] = &*string;
}

3: getStringArray.c 应该根据索引参数从数组中返回一个字符串

char* getStringArray(char** array, int index){
  return (char*)array[index];
}

4: freeStringArray.c 应该用于释放数组。

#include <stdlib.h>

void freeStringArray(char** array, int number){
  free(array);
}

我们也有一个测试主线可供使用。我已经在arrayDefns.h中声明了这些函数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "arrayDefns.h"

#define MAXSIZE 100

int main ( )
{
   char **arrayPtrs;
   char *string;
   char inputStr[MAXSIZE+1];
   int number;
   int i;

   number = 4;
   printf ( "arrayPtrs = createStringArray ( %d )\n\n", number );
   arrayPtrs = createStringArray ( number );

   for ( i=0; i<number; i++ ) {
      printf ( "Enter a string: " );
      fgets ( inputStr, MAXSIZE, stdin );
      inputStr[strlen(inputStr)-1] = '\0';
      string = malloc ( sizeof(char) * (strlen(inputStr)+1) );
      strncpy ( string, inputStr, strlen(inputStr)+1 );
      printf ( "setStringArray ( arrayPtrs, %d, %s )\n", i, string );
      setStringArray ( arrayPtrs, i, string );
      free ( string );
   }

   printf ( "\n" );

   for ( i=0; i<number; i++ ) {
      string = getStringArray ( arrayPtrs, i );
      printf ( "%s = getStringArray ( arrayPtrs, %d )\n", string, i );
   }

   printf ( "\nfreeStringArray ( arrayPtrs, %d )\n", number );
   freeStringArray ( arrayPtrs, number );

   return(0);
}

目前我得到的输出是正确的,一直到最后一个部分,应该打印“%s = getStringArray”,但 %s 部分并没有正确地打印出来。


尝试删除行 free( string ); 看看是否能使它运行得更好一些... - Joël Hecht
@Joël,调用free的代码在测试代码中,他们不应该修改它。 - Roland Illig
一个 char* 不是一个字符串。它可能只是指向字符串的第一个元素。因此,您需要单独定义(暗示分配)实际的“字符串”。 - alk
严格来说,在您展示的代码中根本没有字符串数组。 - alk
正如Roland所说,我无法更改测试代码。它是与示例输出一起提供的。我发现free()在我调用之前就删除了字符串,但是由于Roland在下面的回答中指出,我意识到需要在testcode中释放字符串之前将其存储在数组中。谢谢! - Seb M
2个回答

3
setStringArray中,您应该复制字符串(即实际字符序列)。目前,您只是复制了一个指向它的指针。
为此,您需要使用strlenmallocmemcpy/strcpy函数。这个函数会比其他函数更加复杂。
或者,您也可以使用strdup函数,但该函数不能保证在所有C平台上都可用。

非常感谢!我使用了您的建议,成功让它工作了。 - Seb M

0

你不应该释放变量“string”,因为它仍然指向数据,而你正在擦除该数据;只需删除这行代码:

free ( string );

它会起作用的。


有任何降低评分的原因吗?答案是正确的,如果不清楚,请说出来,我会更好地解释。 - Kroj
1
调用 free 的代码在测试代码中,他们不应该修改它。 - Roland Illig
那个问题中没有写明,你的答案是正确的,但我的方法只是不同而已。 - Kroj
问题中提到“我们必须设计这4个函数的内部”。这意味着他们不应该修改其他代码。 - Roland Illig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接