我的字符串数组初始化如下:
char ** strArray;
if ( (strArray = malloc(sizeof(*strArray) + 3)) == NULL ) {
fprintf(stderr, "ls1: couldn't allocate memory");
//exit(EXIT_FAILURE);
}
strArray[0] = NULL;
strArray[0] = "111";
strArray[1] = "222";
strArray[2] = "1";
strArray[3] = "2";
我想将此字符串数组转换为int数组,如下所示:
int * toIntArray(char ** strArray) {
int size = getCharArraySize(strArray);
int intArray[size];
int i;
for ( i = 0; i < size ; ++i)
{
intArray[i] = atoi(strArray[i]);
printf( "r[%d] = %d\n", i, intArray[i]);
}
intArray[size] = '\0';
return intArray;
}
int getCharArraySize(char ** strArray) {
int s = 0;
while ( strArray[s]) {
printf("Char array: %s.\n", strArray[s]);
s++;
}
return s;
}
然后我想对这个int数组进行排序。
我必须像上面一样启动字符串数组(char ** strArray),然后将其转换为int数组,然后对其进行排序。任何人都可以帮助我吗?我会问主要功能中打印的排序整数。
答案 0 :(得分:0)
在问题代码中需要注意的一些小问题:
char ** strArray;
if ( (strArray = malloc(sizeof(*strArray) + 3)) == NULL ) {
fprintf(stderr, "ls1: couldn't allocate memory");
//exit(EXIT_FAILURE);
}
如果成功,上面代码的意图将内存分配给strArray足以容纳三个char *
。具体来说,strArray [0],strArray 1和strArray [2]。
注意: 正如Matt McNabb在下面的评论中所指出的,它实际上错误地为一个char *分配了足够的内存,还有三个额外的字节。
strArray[0] = NULL;
上面的行集将** strArray中的第一个指针设置为NULL。
strArray[0] = "111";
以上代码很奇怪。在将strArray [0]设置为NULL之后,上面的行将其更改为指向“111”。将它设置为NULL(首先)似乎没必要。
strArray[1] = "222";
strArray[2] = "1";
以上两行正确初始化了strArray中的另外两个指针。
strArray[3] = "2";
当数组的元素确实不存在时,上面的行尝试初始化strArray [3]。因此,它正在改变指向“2”的东西,但可能没有达到预期的结果。
通过将上述代码更改为:
,也许可以更好地实现意图 char **strArray;
size_t strArrayElements=4;
if(NULL == (strArray = malloc((strArrayElements+1) * sizeof(*strArray))))
{
fprintf(stderr, "ls1: couldn't allocate memory");
exit(EXIT_FAILURE);
}
strArray[strArrayElements] = NULL;
strArray[0] = "111";
strArray[1] = "222";
strArray[2] = "1";
strArray[3] = "2";
可以看出,上面的代码为** strArray分配了5个元素(strArrayElements + 1)。最后一个元素strArray[4]
被初始化为NULL;表示End-Of-List
的标记。然后初始化其他4个元素[0..3]。
现在将焦点转移到:
int * toIntArray(char ** strArray) {
int size = getCharArraySize(strArray);
int intArray[size];
int i;
for ( i = 0; i < size ; ++i)
{
intArray[i] = atoi(strArray[i]);
printf( "r[%d] = %d\n", i, intArray[i]);
}
intArray[size] = '\0';
return intArray;
}
上面的代码成功地将字符串转换为整数形式,并将它们存储在intArray
中。但是,当代码尝试return intArray
给调用者时,代码存在缺陷。 intArray
变量被声明为本地堆栈对象。 return
语句导致所有此类堆栈变量无效;并允许堆栈内存这些变量用于其他事情。
以下代码可能更好地代表了预期的内容。它为堆分配intArray的内存。这个分配的内存可以比return语句更长:
int *toIntArray(char **strArray)
{
int size = getCharArraySize(strArray);
int *intArray = malloc(size * sizeof(*intArray));
int i;
for ( i = 0; i < size ; ++i)
{
intArray[i] = atoi(strArray[i]);
printf( "r[%d] = %d\n", i, intArray[i]);
}
intArray[size] = '\0';
return(intArray);
}
可以在 here 找到扰流器代码。