修改数组值时出现 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;
}
我在将 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;
}