1

我这里有一些奇怪的输出。你能解释一下为什么以及如何解决它吗?

int inp_str(char * string, char ** pointers[])
{
    char * tmp[stringsCount];
    if (strlen(string) > maxlen)
    return (-1);
    else {
    tmp[count] = malloc(sizeof(char) * strlen(string));
    strcpy(tmp[count], string);
    pointers[count] = &tmp[count];
    count++;
    }
    return count;

}


int main(){

    //char * strings[stringsCount];
    char ** pointers[stringsCount];
    inp_str( "sdasya", pointers);
    inp_str( "dasd", pointers);
    inp_str( "qwe", pointers);
    inp_str( "dasd", pointers);

    //sort(pointers, count);
    printf("%s", *pointers[0]);
    printf("\n%s", *pointers[1]);
    printf("\n%s", *pointers[2]);
    printf("\n%s", *pointers[3]);
}

这是输出:

sdasya
��uNH��H�l$ H�\$L�d$(L�l$0H��8�f.�
qwe
�bs7

PS。stringsCount 是常数;计数 = 0

4

3 回答 3

3

因为char * tmp[stringsCount];是局部变量,所以函数inp_str返回后,内存tmp被系统回收。因此,函数返回后,指向该位置的指针无效。

于 2013-10-08T13:59:37.447 回答
0

我不确定我是否理解你在这里想要做什么。但无论如何,有几个问题:

1)您正在将字符串复制到未初始化的指针中。即,您创建一个指向任何位置的 (char *) 数组,然后将字符串复制到该位置。如果您试图将 tmp 指向您的字符串,请不要使用 strcpy,只需通过 tmp[count]=string;

2) tmp 是在堆栈上创建的,因此如果您将其值分配给指针** 并尝试引用此函数范围之外的地址,则该内存已消失,您可能会看到损坏的数据。

希望这可以帮助。出于好奇,你想在这个函数中做什么?

于 2013-10-08T14:07:17.483 回答
0

除了tmp[]在函数返回后丢失指针之外,您还总是分配比实际所需数量少一个字节:strlen(s)返回字符串的长度,其中不包括终止 NUL 字节。你需要的是(注意 sizeof(char)定义为 1 ):

  char *p = malloc(strlen(string) + 1);
  strcpy (p, string);

复制一个字符串。

于 2013-10-08T14:18:21.580 回答