-2

谁能告诉我为什么以下程序崩溃。

#include<stdio.h>
#include<string.h>
int main()
{
    char **str;
    strcpy(*str, "One");
    puts(*str);
}

以及为什么以下程序没有。

#include<stdio.h>
#include<string.h>
int main()
{
    char **str;
    *str = "One";
    puts(*str);
}
4

4 回答 4

7

strcopy假设您有可用的内存。

在第二个中,您指向*str静态分配的“One”char[]文字,该文字衰减为指针。这实际上也是未定义的,因为str不是初始化,您仍在复制指向乱码的指针。

在第一个中,您尝试将字符串复制到*str未初始化时指向的任何位置。这几乎肯定会使您的程序崩溃,因为它只是指向一些垃圾地址。

所以要正确地做到这一点

//allocate space for ARRAY_SIZE pointers
char **str = malloc(sizeof(char*) * ARRAY_SIZE); 
*str = "One"; // assign the address of "One"
puts(*str); // print it.
...
free(str);
于 2013-07-22T13:08:01.787 回答
2

由于纯粹的运气,您的第二个不会崩溃。它应该是这样的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char **str = malloc(sizeof *str);
    if ( str != NULL ) {
        *str = "One";
        puts(*str);
        free(str);
    }

    return 0;
}

或者:

#include<stdio.h>
#include<string.h>
int main()
{
    char * str;
    str = "One";
    puts(str);

    return 0;
}

在您编写它时,您正试图将字符串文字的地址填充"One"到未分配的内存中,这会给您带来未定义的行为。

您的第一个崩溃出于同样的原因,您试图将字节、、、和复制'O'到未分配的内存中。'n''e''\0'

于 2013-07-22T13:32:44.533 回答
2

第一个:

str 清除为 char**,但是您没有为此使用 memorey 分配!

记住,str是指向指针的指针,所以如果你想在str*中保留一个地址,你应该使用内存分配在声明行中初始化!!

在您的代码中, str* 只是一个地址,而不是字符串!

第二个想法差不多。

于 2013-07-22T13:07:51.600 回答
0

在第一个程序中,您正在将字符串复制到非内存分配的指针。(*str) 没有 malloc、new 等。

在第二个中,您将字符串指针指向堆栈变量。str 指针仅在调用上下文期间有效,当函数退出时,str 指针将指向无效空间。因为这是 main(),所以你看不到

于 2013-07-22T13:08:24.493 回答