修改数组值时出现 C 段错误

C segfault when modifiy array value

我在将 dna[i] 更改为 U 时出现段错误,我已经调试了,但我仍然不明白为什么。

另外,我将某个位置的值与 T 与 strcmp 进行比较,但据我了解,这是字符串文字,我可以简单地将其与 dna[i] == 'T' 进行比较。那正确吗?谢谢。

#include <string.h>

char *dna_to_rna(char *dna) {
    int size = (int)( sizeof(dna) / sizeof(dna[0]));
    char *retour[size];
    strcpy(retour, dna);
    for (int i = 0; i < size; i++) {
        if (dna[i] == 'T') {
            dna[i] = 'U';
        }
    }
    return (char *) retour;
}

int main() {
    char *dna[] = {
            "TTTT",
            "GCAT",
            "GACCGCCGCC"
    };

    char *actual, *expected;
    size_t n;
    for (n = 0; n < 3; ++n) {
        actual = dna_to_rna(*(dna + n));
    }
    return 0;
}

您正在向函数dna_to_rna传递一个指向字符串文字的指针

actual = dna_to_rna(*(dna + n));

然后在您尝试更改字符串文字的函数中

    if (dna[i] == 'T') {
        dna[i] = 'U';
    }

任何更改字符串文字的尝试都会导致未定义的行为。

还有这个声明中带有sizeof运算符的表达式

int size = (int)( sizeof(dna) / sizeof(dna[0]));

没有意义。它计算 char *.

类型指针的大小

您应该使用标准字符串函数 strlen.

而且这个声明是不正确的

char *retour[size];

至少你需要一个字符数组而不是指针数组。

 char retour[size];

并且函数return是一个指向数组的指针,具有自动存储持续时间,退出函数后将不存在

char *dna_to_rna(char *dna) {
    //...
    char retour[size];
    //...
    return (char *) retour;
}

那个函数return是一个无效指针。

您应该在函数内动态分配一个长度为 strlen( dna ) + 1 的字符数组,然后更改 return 这个数组。

你的意思好像是下面这样

#include <string.h>
#include <stdlib.h>

char * dna_to_rna( const char *dna ) 
{
    size_t n = strlen( dna );
    char *retour = malloc( n + 1 );

    if ( retour != NULL )
    {
        strcpy( retour, dna );

        for ( size_t i = 0; i < n; i++ ) 
        {
           if ( retour[i] == 'T' ) retour[i] = 'U';
        }
    }

    return retour;
}