初めまして、タイトル失礼します。どのように表現すればよいか、あまりよくわかりませんでした。
C では、次のように宣言および割り当てられた 2D 文字列配列があります。
char ** args = malloc(50*(num_args+1));
for (int i = 0; i < num_args+1; i++){
args[i] = malloc(50);
私はこれを一種の「初歩的なシェル」タイプのプログラムで使用しており、bash の機能の一部を模倣しているため、num_args 変数を使用しています。
複数のマシンでコンパイルして実行すると、args[4] のアドレスは常に範囲外になります。関連する gdb 出力は次のとおりです。
(gdb) print args[0]
$2 = 0x609140 "gcc"
(gdb) print args[1]
$3 = 0x609180 ""
(gdb) print args[2]
$4 = 0x6091c0 ""
(gdb) print args[3]
$5 = 0x609200 ""
(gdb) print args[4]
$6 = 0x636367 <Address 0x636367 out of bounds>
(gdb) print args[5]
$7 = 0x609280 ""
ご覧のとおり、args[4] の前後のアドレスは有効です。この 1 つのアドレスがどのように範囲外になるのでしょうか?
このコードが使用される関数全体は、次のとおりです。
void parse(const char * command){
// first parse built-ins (ie, not a call to the OS)
if (strcmp(command, "history") == 0){
show_history();
return;
}
if (strcmp(command, "exit") == 0){
exit(0);
}
hist_add(command);
// copy 'command' into arg_string, while ignoring any possible comments
char * arg_str;
int num_args = 1;
arg_str = malloc(strlen(command));
for (int i = 0; i < strlen(command); i++){
if (command[i] == '#' || command[i] == '\n') break;
if (command[i] == ' ') num_args++;
arg_str[i] = command[i];
}
// split arg_str into a string array where each string is an argument
// to the command
char ** args = malloc(num_args+1);
for (int i = 0; i < num_args+1; i++){
args[i] = malloc(50);
}
int tokens = 0;
const char token = ' ';
char * next = strtok(arg_str, &token);
while (next != NULL){
strcpy(args[tokens++], next);
next = strtok(NULL, &token);
if (next == NULL)
args[tokens] = (char *)NULL;
}
exec_command(args);
}