c语言的字符串指针

时间:2013-07-22 13:03:14

标签: c string pointers

任何人都可以告诉我为什么以下程序崩溃。

#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 个答案:

答案 0 :(得分:7)

strcopy假设您有可用的内存。

在第二个中,您将*str指向静态分配的“一个”char[]字面值,该字面值会衰减为指针。这实际上也是未定义的,因为str不是init'd你还在复制指向乱码的指针。

在第一个中,您尝试将字符串复制到*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);

答案 1 :(得分:2)

第一个:

str为char **,但是你没有使用memorey分配!

Remmber,str是指向指针的指针,所以如果你想在str *中保留地址,你应该在声明行中使用memorey allocation 初始化!!

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

第二个是同样的想法。

答案 2 :(得分: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'复制到未分配的内存中。

答案 3 :(得分:0)

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

在第二个中,您将字符串指针指向堆栈变量。 str指针仅在调用的上下文中有效,并且当函数退出str指针时将指向无效空间。由于这是main(),你没有看到