linux中有Char这条指令吗

linux中有Char这条指令吗,第1张

Linux编程中在命令行启动另一个可执行文件或调用命令用system函数最简单了,这个函数原理是在你编写的那个程序的内部启动另一个程序或命令,从而创建一个新进程,并等待这个进程执行完毕退出。如果正常执行,system函数将返回被执行程序或命令的退出码;如果无法运行这个程序或命令,将返回错误代码127;如果是其他错误,返回-1。这个函数的原型是:

#include <stdlib.h>

int system(const char *string)

参数string是将要执行的程序文件名或路径,如果是启动一个命令就是一个命令字符串。

还有一种执行外部程序的方法是exec系列函数,一般是在fork的子进程里面调用exec系列函数,那主进程里直接调用exec系列不行吗,为什么要fork再在子进程里调用呢?因为exec系列的函数(包括execl函数)都是将当前进程替换成新进程,也就是说新进程启动后原来的进程就不存在了,exec系列函数后面的那些代码就不会再执行了。如果你不放在fork子进程里面,那主进程在执行execl函数后就完全不存在了,所以exec系列函数的使用都是先fork然后在子进程里面调用。因为exec系列函数都要使用fork调用,所以我一般是用system函数。

原文: Segmentation Fault With Char Array and Pointer in C on Linux

我有下面的程序:

int main(){

  char* one = "computer"

  char two[] = "another"

  two[1]='b'

  one[1]='b'

  return 0

}

段错误发生在 "one[1]='b'"这一行上,这是有道理的,因为这个one指针指向的内存时只读内存。然而,问题是为什么 "two[1]='b'"这行没有发生段错误呢?查看gcc的汇编输出:

.file "one.c"

        .section        .rodata

.LC0:

        .string "computer"

.LC1:

        .string "another"

        .text

.globl main

        .type  main, @function

main:

我们看到两个字符串都在 只读数据区域。那么为什么 “two[1]='b'”这行没有发生段错误呢?

one指针指向的stirng在只读页。另一方面,two是一个分配在栈上的数组,使用一些常量数据进行初始化。在运行期间,在只读区域的string会被拷贝一份到栈上。你修改的是string在栈上的拷贝,不是只读内存页。

更高层次的看法,从语言的视角看。“abcd”是一个const char*而不是 char*。因此,修改这样的指针值的结果是未定义的。这个语句char* one = "something",存储了一个指向字符串的指针(不安全的,它把const属性转换没了)。char two[] = "something"则是完全不同的。它实际上声明了一个数组并初始化了它,就像这样 int a[] = {1,2,3}。这里的引号里面的string是一个初始化表达式。

你看到的“another”在只读区域会被拷贝到数组 two中,在数组初始化的时候。另一方面,字符串“computer”的地址会被分配给one。

因此,one是指向只读区域(在这里写会发生段错误),two会分配在栈上然后拷贝一份“another”。

第二个形式会创建一个数组并拷贝这个字符串:

它等同于:

char two[] = {'a', 'n', 'o', 't', 'h'. 'e', r', '\0'}

你可以使用变量初始化字符数组,像这样:

char c = 'a'

char two[] = {'a', 'n', c, '\0'}

字符数组不能直接赋值字符串。只能一个个赋值,或者用strcpy();

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main()

{

char t[5] = {0}

char *s = (char *)malloc(strlen(t))

strcpy(t, "12345") 

/*

或者 t[0] = '1' t[1] = '2'...t[4] = '5'如果定义时没有初始化,做 ={0} *** 作,最好加上t[5] = '\0'

*/ 

s = t

printf("%s\n", s)

return 0

}

以上。linux头文件或许有些不同,编译不过的话请man strcpy 和 malloc查询正确的头文件


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/6160434.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-16
下一篇2023-03-16

发表评论

登录后才能评论

评论列表(0条)

    保存