2

下面的 C 程序将把最短和最长的字符串打印为t[0]t[n-1]。但是,当我运行此代码时,它说存在内存问题。我的代码有什么问题?

问题是最后两行,带有“strcpy”。

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

void fx (char* t[], int n);

int main(void)
{
    char* t[] = {"horse", "elephant", "cat", "rabbit"};
    int n;
    n = sizeof( t )/ sizeof( t[0] );
    fx(t, n);
    printf("shortest is %s, longest is %s\n", t[0], t[n-1]);
}

void fx (char* t[], int n)
{
    char st[50], lt[50];
    strcpy(lt,t[0]);
    strcpy(st,t[0]);
    for (int i=0; i<n; i++)
    {
        if (strlen(t[i]) < strlen(st))
            strcpy(st,t[i]);
        if (strlen(t[i]) > strlen(lt))
            strcpy(lt,t[i]);
    }
    strcpy( t[0], st);
    strcpy( t[n-1], lt);
}
4

3 回答 3

7

两个 strcpy()s,

strcpy( t[0], st);
strcpy( t[n-1], lt);

错了!t[i]指向 const 字符串文字 - 不可修改,这会在运行时 导致未定义的行为。

于 2013-10-09T16:20:19.517 回答
3
char* t[] = {"horse", "elephant", "cat", "rabbit"};

声明一个指向字符串字面量的指针数组。字符串文字可以放在只读内存中并且不能修改。最后几strcpyfx试图写入只读内存。

于 2013-10-09T16:20:05.513 回答
0

当你这样做

char *ptr = "string";

在那之后,如果你这样做

ptr[0]='S';

这会给你错误。它会编译。原因是,“字符串”放置在内存的数据段或文本部分中并且是常量。这使得ptr,指向常量字符串的指针,因此不允许修改。

同样,所有指向字符串的指针,即horseelephant等都是常量,不应更改。

于 2013-10-09T16:36:03.577 回答