C 传入参数的连续内存

C 传入参数的连续内存,c,pointers,memory,parameters,C,Pointers,Memory,Parameters,我试了些东西,发现了这个小怪事。使用下面的代码,它将输出“World”(每行上的每个字符都被打断)。这是否意味着传递给函数的参数在内存中是连续的 #include <stdio.h> #include <string.h> void mystrtst(char *s, char *t); int main() { mystrtst("Hello", "World"); } void mystrtst(char *s, char *t) { while(*s+

我试了些东西,发现了这个小怪事。使用下面的代码,它将输出“World”(每行上的每个字符都被打断)。这是否意味着传递给函数的参数在内存中是连续的

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

void mystrtst(char *s, char *t);

int main() {
  mystrtst("Hello", "World");
}

void mystrtst(char *s, char *t) {
  while(*s++);
  for( ; *t ; s++, t++) {
    printf("%c\n", *s);
  };
}
#包括
#包括
void mystrtst(char*s,char*t);
int main(){
mystrtst(“你好”,“世界”);
}
void mystrtst(char*s,char*t){
而(*s++);
对于(;*t;s++,t++){
printf(“%c\n”,*s);
};
}

您有指向存储在内存中的两个字符串的指针

你看到的是未定义的行为


不能保证这两个字符串总是以输出显示的方式存储

正如@Gopi所说,这是一种未定义的行为。 要理解它,请运行这段代码

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

void mystrtst(char *s, char *t);

int main() {
  char s1[]="Hello";
  char  t1[]="World";
  mystrtst(s1, t1);
}

void mystrtst(char *s, char *t) {
  while(*s++);
  for( ; *t ; s++, t++) {
    printf("%c\n", *s);
  };
}
#包括
#包括
void mystrtst(char*s,char*t);
int main(){
字符s1[]=“你好”;
字符t1[]=“世界”;
mystrtst(s1,t1);
}
void mystrtst(char*s,char*t){
而(*s++);
对于(;*t;s++,t++){
printf(“%c\n”,*s);
};
}
您将得到一些随机字符,表明参数的内存不是连续的。事实上,你只是在传递地址


当您直接以“Hello”、“World”的形式传递参数时,它会存储在只读内存中,并传递指向这些内存地址的指针,在您的情况下,内存会以某种方式变得连续。不要期望每次都有同样的行为。它是未定义的。

也许这篇文章可以帮助您。在字符串文本中,字符是连续存储的。字符串不是传递给函数的,而是它们的地址。因为它们是字符串文字,所以它们可能位于内存中的只读部分。c标准并不要求它们在该部分中是否是连续的,也就是说,您正在调用未定义的行为。大多数实现都是这样工作的,但这段代码绝对不能保证工作正常。这是一种非标准行为,我不知道有哪种编译器扩展可以保证字符串常量可以这样管理。换句话说,它是UB。